这是一个相当简单的问题,整个网络都已经解决了它,但我找不到解决我的问题的方法。
我正在尝试使用此 .htaccess 文件强制在我的网站的 URL 上使用尾随斜杠:
# Don't allow directory indexing
Options -Indexes -Multiviews
# Turn on the URL rewrite engine
RewriteEngine On
# Add trailing slashes
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]
# send the request to [first pseudo-directory].php?p=[all the rest]
# not a known file or directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#exclude URIs with a dot in them
RewriteCond %{REQUEST_URI} !\..+$
RewriteRule ^(.*?)/(.*)$ $1.php?p=$2 [L,NS]
# Handle other errors
ErrorDocument 404 /errors.php?code=404
ErrorDocument 500 /errors.php?code=500
然而,当有人访问http://domain.tld/mobile/hours
(没有尾随斜杠)时,它会被重定向到http://domain.tld/var/www/html/mobile/hours/
具有尾随斜杠的页面,但莫名其妙地还具有完整的内部路径,这会导致 404 错误,原因很明显。
当然,我寻求的正确结果是http://domain.tld/mobile/hours/
有什么提示吗?
答案1
为了后代:
修改该行.htaccess
下面的文件RewriteEngine On
使其如下所示:
RewriteBase /
# Add trailing slashes
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://sub.tld.com/$1/ [L,R=301]
...显然已经解决了这个问题。不确定这次我做了什么不同的事情,因为我之前已经做过所有这些更改,但现在它可以正常工作了。我认为这可能与显式 URL 和规则有关RewriteBase /
。
欲了解更多信息,请参阅这个简短的教程。
感谢大家的帮助,我不是 100% 确定是什么解决了这个问题,但希望这些内容可以帮助遇到同样问题的人。
答案2
尝试改变这个规则:
RewriteRule ^(.+[^/])$ $1/ [R]
要在反向引用前添加斜线:
RewriteRule ^(.+[^/])$ /$1/ [R]
答案3
添加L
文档喜欢
RewriteRule ^(.+[^/])$ /$1/ [R,L]
它将使规则的评估在此点停止,并使用当时重写的 URL 发出重定向。
如果您省略L
以下规则,则仍将执行并进行进一步重写,最终重写是从 URL 到文件系统路径。只有这样,实际的重定向才会发生,您可以在当前响应中观察到最终路径。