这是一个相当简单的问题,已经在networking上解决,但我找不到解决我的问题。
我试图用这个.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 (没有结尾的斜杠)时,它会被redirect到http://domain.tld/var/www/html/mobile/hours/ ,后者具有斜线,但莫名其妙地也有完整的内部path,导致404错误,原因很明显。
当然,我正在寻找的正确结果是http://domain.tld/mobile/hours/
任何提示?
为了后代:
修改RewriteEngine On下面的.htaccess文件在线看起来像这样:
RewriteBase / # Add trailing slashes RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://sub.tld.com/$1/ [L,R=301]
…显然解决了这个问题。 不知道这次我做了什么改变,因为我之前做过所有这些改变,但现在正在工作。 我认为这可能与显式URL和RewriteBase /规则有关。
有关更多信息,请参阅此简短教程 。
感谢大家的帮助,我不是100%确定是什么解决了这个问题,但希望这些线路可以帮助有同样问题的人。
尝试改变这个规则:
RewriteRule ^(.+[^/])$ $1/ [R]
要在反向引用之前包含斜线,请执行以下操作:
RewriteRule ^(.+[^/])$ /$1/ [R]
按照文档强烈build议的那样添加L标志
RewriteRule ^(.+[^/])$ /$1/ [R,L]
这将使规则的评估停止在这一点,并发出redirect与当时重写的URL。
如果你省略了L下面的规则仍将被执行,并且进一步的重写将会发生,最后的重写是从URL到文件系统path。 只有这样,实际的redirect才会出现在当前响应中可以观察到的最终path上。