同时使用.htaccess重写规则和重定向301?

时间:2014-07-27 14:02:21

标签: apache .htaccess url mod-rewrite url-rewriting

我想在我的网站上以不同的方式显示几个特定的​​网址。例如,我希望“/contact.php”成为“/ contact”。所以我把它添加到了我的.htaccess:

RewriteRule ^contact$ contact.php

为避免两个不同的URL指向同一页面,我还想在旧URL和新URL之间进行301重定向:

Redirect 301 /contact.php http://www.example.com/contact  

上面的每一行都可以分别运作。但是如果我在我的htaccess中添加它们,我有一个重定向循环。我该如何解决这个问题?

最后,如果我输入“/ contact”或“/contact.php”,我希望看到包含网址“/ contact”的联系页面。


编辑:我也尝试了类似的东西,它不起作用:

RewriteRule ^/contact\.php$ http://www.example.com/contact [R=301,L]
RewriteRule ^/contact$ /contact.php [L]

1 个答案:

答案 0 :(得分:0)

是的,它确实会导致重定向循环,因为mod_rewrite规则在循环中应用。此处REQUEST_URI的值在第一次规则后更改为contact.php你的第二条规则contact

要避免此循环,您需要在外部重定向规则中使用%{THE_REQUEST},因为THE_REQUEST变量表示Apache从您的浏览器收到的原始请求,并且在执行某些操作后它不会被覆盖其他重写规则。此变量的示例值为GET /index.php?id=123 HTTP/1.1

使用此:

RewriteEngine On

# external redirect from /contact.php to /contact  
RewriteCond %{THE_REQUEST} \s/+(contact)\.php\[\s?] [NC]
RewriteRule ^ /%1? [R=302,L]

# internal forward from /contact to /contact.php
RewriteRule ^(contact)/?$ $1.php [L,NC]

一旦确定它正常工作,请将302更改为301