我正在尝试使用Apache vhosts配置控制我网站上的重定向。
我设置了两个字母的区域,例如/fr
,/de
,/es
,我目前正在忽略这些区域,您将从下面的vhosts文件中看到。但是我还有一个301永久重定向设置,可以将/ cm(以及/fr/cm
,/es/cm
等)重定向到另一个页面 - 这是在我的后端系统中控制的。
复杂的是,当我添加了由RewriteCond捕获的行RewriteCond %{REQUEST_URI} !^/cm
时,然而我无法访问/fr
,/de
,/es
等所有因为它们似乎陷入循环并转到:www.ayrshireminis.com/fr/fr/fr/fr/fr/fr/fr/fr
然后是HTTP 500内部服务器错误。
如何更改RewriteCond以允许:
等
# ----------------------------------------------------------------------
# REGION SPECIFIC REDIRECTIONS
# Below will remove region specific part of URL and load content from main UK site
# ----------------------------------------------------------------------
RewriteCond %{REQUEST_URI} ^/([a-z]{2})$ [OR]
RewriteCond %{REQUEST_URI} ^/([a-z]{2}/)(.*)$
RewriteCond %{REQUEST_URI} !^/cm
RewriteRule ^([a-z]{2}/|[a-z]{2})(.*)$ /$2 [L,QSA]
# For VirtualDocumentRoot development instance configurations
RewriteRule ^([^.]+)$ /index.php?url=$1 [L,QSA]
答案 0 :(得分:0)
想想我在这看到你的麻烦。问题的格式似乎掩盖了[OR]
在您的第一个RewriteCond
行的末尾和RewriteRule本身的[L,QSA]
。
以下是我建议您尝试的内容:
RewriteCond %{REQUEST_URI} !^/cm
RewriteCond %{REQUEST_URI} ^/([a-z]{2})/?(.*)$
RewriteRule .* $2 [L,QSA]
我更喜欢使用“守护者”模式来抛弃从一开始就不会触及的任何东西。您列出的指令的逻辑似乎存在错误。前两个指令似乎说“如果REQUEST_URI以仅两个字符 OR 开头,它只以两个字符开头,有一个”/“然后直到最后, 然后继续处理。“
如果REQUEST_URI是“/ fr”,它将匹配您在问题中包含的指令的第一个RewriteCond
。但如果确实符合这一点,那会是什么呢?如果您要重写第二个括号分组,并且如果模式没有检测到第二个括号分组,那么如果没有任何重定向到的话,如何进行任何重定向?然后,请求将在您的配置中进一步传递给后续的重写规则。
我也认为RewriteRule
可能不好。在当前指令中,您可能应该:
RewriteRule ^/([a-z]{2}/|[a-z]{2})(.*)$ /$2 [L,QSA]
你可能应该添加一个前导“/”字符,否则“$ 2”可能会匹配整个REQUEST_URI。 REQUEST_URI应始终以“/”开头。
您可能已经尝试过此操作,但建议您启用更详细的日志记录,tail
日志文件,以便在您将这些模式输入浏览器并访问该网站时查看模式是否匹配。我目前使用这个:
RewriteEngine On
RewriteLog /usr/local/apache2/logs/rewrite.log
RewriteLogLevel 3
我无法解释你为什么要在重定向循环中结束,因为[L]
应该阻止这一点。我唯一能想到的是,如果你的应用程序的其他方面(在这些指令之外)涉及重定向,它们可能会以某种方式引发这种行为,并将请求反馈给Apache。更详细的日志记录可能有助于将其与您的access_log相结合。