2010-06-18 63 views
22

我使用mod_rewrite/.htaccess获得漂亮的URL。mod_rewrite:删除尾部斜杠(只有一个!)

我使用这个条件/规则来消除尾随斜杠(或者说:通过301重定向重写到非尾随斜杠URL;我这样做是为了避免重复的内容,因为我喜欢URL没有后斜线更好):

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{HTTP_HOST} !^\.localhost$ [NC] 
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

到目前为止工作得很好。唯一缺点:
它也转发“多行尾斜杠”-URL非尾随斜杠-URL

例子:
http://example.tld/foo/bar//////转发到http://example.tld/foo/bar
而我只想http://example.tld/foo/bar/转发到http://example.tld/foo/bar

那么,如果实际上只有一个只有一个尾部斜线,是否可以只消除尾部的斜线?

对不起,如果这是一个有点烦人或奇怪的问题!

谢谢。

+0

同样的问题:http://stackoverflow.com/questions/19990838/remove-trailing-slash-from-sub-directory-folder-apache-1-3-42-directoryslash-off – 2016-07-06 16:54:49

回答

3
^(.+[^/])/$ 

I.e.前面的字符不能是斜线。

14

变化的重写规则:

RewriteRule ^(.+[^/])/$ http://%{HTTP_HOST}/$1 [R=301,L] 
英语

:字符串,一个或多个任何东西,而不是一个斜线,斜线,结束的开始匹配。

+1

这并不适用于我。 – user367217 2010-06-18 10:30:50

+1

看来'http://%{HTTP_HOST}/$ 1'应该是'http://%{HTTP_HOST} $ 1',否则一个额外的/被添加到新的url的开头。 – 2015-01-04 07:16:01

17

以下规则将匹配在一个斜杠结尾的网址,并从它的结尾处,删除所有斜杠:

RewriteRule ^(.*)/+$ $1 [R=301,L] 

注:目前公认的答案仅适用于HTTP没有使用https,但这个作品对彼此而言。

+13

我一直屏住呼吸2个月... – Ben 2013-05-28 07:16:04

+0

@steve完成的答案显然是值得期待的。 – nickhar 2013-06-07 09:18:36

+0

我刷新了这个网页超过2年,现在正在等待答案...这是我把网站生活之前我需要做的最后一件事... – 2015-06-05 16:16:09

1

这是基础的解决方案,从网址中删除斜杠一个模别名:

RedirectMatch ^/(.*?)/$ /$1 

您可以用上面的重定向在你的htaccess或server.config文件。

这会将/uri/重定向到*/uri **。

+1

这对我有用,aleemb的答案没有工作,因为我使用虚拟主机。 – 2017-08-15 09:48:36