这是一个反复出现的问题。对此有类似的问题,但没有什么能回答我的问题。
我有一个网站,我希望每个网页只能在一个网址上使用。它应该在所有页面上动态工作,而不是在一个严格的硬编码文件名上。
domain.tld/foo
应重定向到domain.tld/foo/
domain.tld/foo.php
应重定向到domain.tld/foo/
domain.tld/foo/
应该向用户提供(但不会将其重定向到)domain.tld/foo.php
1和3并不太难,但是如果不引入循环引用并且没有太多的重定向,我就无法弄清楚2。我怎么能这样做?
答案 0 :(得分:2)
尝试以下三条规则:
RewriteCond %{THE_REQUEST} ^GET\s/[^?\s]+\.php[?\s]
RewriteRule (.+)\.php$ /$1/ [L,R=301]
RewriteCond $0 !.+\.php$
RewriteRule (.*[^/])$ /$1/ [L,R=301]
RewriteRule (.+)/$ $1.php [L]
要排除任何其他现有文件,请将此规则放在其他文件的前面:
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !.+\.php$ - [L]
答案 1 :(得分:1)
重写#1由
处理DirectorySlash on
无论如何都应该是默认值。
对于#2和#3:
RewriteRule /(.+).php /$1/ [R=301,L]
RewriteRule /(.+)/ /$1.php
答案 2 :(得分:0)
如果我的理解正确,那么您的问题与我在此处发布问题时所遇到的问题类似How can I detect if page was requested via a redirect?
虽然我们找不到完全解决问题的答案,但仍有一些回复可能会对您有所帮助。