我想在我的网站上以不同的方式显示几个特定的网址。例如,我希望“/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]
答案 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
。