【问题标题】:Negative Comparison of Variables in Apache RewriteCondApache RewriteCond 中变量的负比较
【发布时间】:2017-12-18 17:09:11
【问题描述】:

我有一个重写块,旨在将用户重定向到反映其区域设置的 URL,如果他们还没有的话。这似乎需要我比较两个变量,我意识到这在 RewriteCond 中有点棘手,但必须有一种方法可以优雅地做到这一点,而不是有几个不同的规则。

基本上 - 如果我在这里但不应该在这里(因为地理围栏),请重定向到已识别的路径。

# Snip several SetEnvIf rules for the UserLocale variable used below

RewriteCond %{REQUEST_URI} ^/(us|au|uk|eu)/$
# This is where I'm having trouble. 
# This following condition should evaluate whether the requested URI matches the StoreLocale
RewriteCond %{ENV:UserLocale} !%1
RewriteRule ^(.*)$ https://example.com/%{ENV:UserLocale}/ [R=302,L]

我知道有一些关于combining two variables 的语法,但我无法在这里得到否定测试。

【问题讨论】:

  • 所以RewriteRule 应该在%{ENV:StoreLocale} 不是%{REQUEST_URI} 时触发?还有RewriteCond %{REQUEST_URI} ^/(us|au|uk|eu)/$背后的逻辑是什么?
  • 是的。本质上是:“如果请求的 URL 是 /(us|au|uk|eu)/”,那么如果捕获的片段与定义的 StoreLocale 不匹配(例如,我正在请求 /eu/ 但 StoreLocale 是 us)”,然后重定向到包含 StoreLocale 的 URL。(注意:将“StoreLocale”视为“UserLocale”可能更符​​合上下文意义。我会更新)
  • 所以%{ENV:UserLocale} 的值是/us/ 还是只是us
  • UserLocale 将是“我们”、“澳大利亚”、“英国”或“欧盟”

标签: regex apache mod-rewrite


【解决方案1】:

你可以使用这样的规则:

RewriteCond %{ENV:UserLocale}#$1 !^([^#]+)#\1$
RewriteRule ^(us|au|uk|eu)/$ https://example.com/%{ENV:UserLocale}/ [R=302,L,NC]

这实际上是这段代码:

if ( %{ENV:UserLocale} != $1 ) {
   RewriteRule ^(us|au|uk|eu)/$ https://example.com/%{ENV:UserLocale}/ 
}

【讨论】:

  • 谢谢你,@anubhava!上面有点疯狂的正则表达式,你愿意解释一下吗?
  • 其实没那么疯狂。在 LHS 上,我们将 %{ENV:UserLocale}$1 值与分隔符组合为 #。然后在 RHS 上,我们将# 之前的部分匹配并分组到第 1 组。我们在# 之后使用\1 反向引用它,以确保我们在# 之前和之后具有相同的值。 ! 的存在否定了整个条件,从而给了我们%{ENV:UserLocale} != $1 条件的效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2014-01-27
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多