我想要实现的是让我的页面上的所有网址看起来都像http://domain.com/page/
,没有扩展名,只有一个尾随的斜杠。如果用户想要写http://domain.com/page
或http://domain.com/page.php
,则会重定向到第一个网址。经过一些谷歌搜索后,我发现了这个代码,它已经接近工作了,但是当你在请求中省略了斜杠时,网址会变成类似http://domain.com/Users/"..."/page/
的内容,因此会返回404。
我的.htaccess看起来像这样:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ $1.php [L]
RewriteCond %{REQUEST_FILENAME} !(.*)/$
RewriteRule (.*)/$ $1.php [L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]
我一直在尝试添加一条额外的规则,但我真的没有得到任何这个,而且我找不到任何答案。
答案 0 :(得分:2)
对于像这样的场景,.htaccess
作者必须同时考虑浏览器URL栏应显示的内容以及Web服务器应返回/执行的文件。另请注意,每个外部重定向都会开始处理重写指令。
考虑到这一点,首先要注意当URL格式正确时返回哪个文件:
RewriteEngine on
RewriteRule ^/?$ /index.php [L]
RewriteRule ([^./]+)/$ /$1.php [L]
然后,通过使用[R=301]
重定向来处理没有尾部斜杠的网址:
RewriteRule ^/(.*)\.[^.]*$ http://www.example.com/$1/ [R=301,L]
RewriteRule ^/(.*)$ http://www.example.com/$1/ [R=301,L]
请注意,这两个规则中的第一个也应该通过消除文件扩展名并重新添加斜杠来处理存在文件名(如something.php)的情况,还要处理尾部斜杠。
请记住,如果您的内部目录结构与Web服务器所服务的内容不匹配(在共享主机方案中通常就是这种情况),您可能需要在之后立即添加RewriteBase
指令。 RewriteEngine
指令。 See the Apache docs获得解释。