与.htaccess中的RewriteRule完全匹配特定单词

时间:2018-05-31 18:43:11

标签: .htaccess mod-rewrite

我用一些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或任何其他网址包含联系人

谢谢!

1 个答案:

答案 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]

确保在测试这些重定向之前清除浏览器缓存。