我用一些RewriteRules设置我的.htaccess文件,但不幸的是我卡住了。我已经找到了很多这方面的主题,但没有提到我的具体问题。 我有这个:
RewriteEngine On
RewriteBase /
RewriteRule ^en/contact /contact.php?lang=en&slug=ok [L,NC]
RewriteRule ^contact /en/contact [L,R=301]
目的是强制lang作为url中的第一个参数(如果未设置)。 因此:www.example.com/contact应重定向(301)到www.example.com/en/contact,然后再次从/contact.php?lang=en&slug=ok
加载内容我遇到的问题是我最终在循环中,因为/contact.php?lang=en&slug=ok被加载并被 RewriteRule ^ contact / en / contact [L,R = 301]解析] 再次。
我如何调整此规则,以便 / contact 仅,而不是/contact.php或/ en / contact或/ contactme或任何其他网址包含联系人
谢谢!
答案 0 :(得分:0)
您的301重定向规则导致无限循环,因为它与您的第一个规则的目标路径匹配。发生的情况是,当您请求/en/contact
时,您的第一条规则会将其重写为/contact.php?lang=en&slug=ok
,然后您的第二条规则会匹配相同的uri并将其重定向到/en/contact
。
要解决此问题,您可以在RewriteRule中使用END标记或使用THE_REQUEST
条件。
RewriteEngine On
RewriteBase /
RewriteRule ^en/contact /contact.php?lang=en&slug=ok [L,NC,END]
RewriteRule ^contact /en/contact [L,R=301]
注意:END
标志仅适用于2.4
以上的apache版本,如果您的服务器版本低于2.4,则可以使用% {THE_REQUEST}
条件终止重定向循环
RewriteEngine On
RewriteBase /
RewriteRule ^en/contact /contact.php?lang=en&slug=ok [L,NC]
RewriteCond %{THE_REQUEST} /contact
RewriteRule ^contact /en/contact [L,R=301]
确保在测试这些重定向之前清除浏览器缓存。