尾随斜杠.htaccess规则导致使用完整的内部位置

这是一个相当简单的问题,已经在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上。