mod_rewrite:删除尾部斜杠(只有一个!)

Posted

技术标签:

【中文标题】mod_rewrite:删除尾部斜杠(只有一个!)【英文标题】:mod_rewrite: remove trailing slash (only one!) 【发布时间】:2011-03-05 07:54:32 【问题描述】:

我将 mod_rewrite/.htaccess 用于漂亮的 URL。

我正在使用此条件/规则来消除尾部斜杠(或者更确切地说:通过 301 重定向重写为非尾部斜杠 URL;我这样做是为了避免重复的内容,并且因为我喜欢带有没有斜线更好):

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

到目前为止运行良好。唯一的缺点: 它还将 "multiple-trailing-slash"-URLs 转发到 non-trailing-slash-URLs

示例:http://example.tld/foo/bar////// 转发到http://example.tld/foo/bar 而我只希望http://example.tld/foo/bar/ 转发到http://example.tld/foo/bar

那么,如果它实际上是一个尾斜杠,是否可以只消除尾斜杠?

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

谢谢。

【问题讨论】:

同样的问题:***.com/questions/19990838/… 【参考方案1】:
^(.+[^/])/$

即最前面的字符不能是斜线。

【讨论】:

【参考方案2】:

将重写规则更改为:

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

英文:匹配字符串的开头,一个或多个任意,不是斜线,斜线,结尾。

【讨论】:

看来http://%HTTP_HOST/$1 应该是http://%HTTP_HOST$1 否则会在新网址的开头添加一个额外的/。【参考方案3】:

以下规则将匹配任何以斜杠结尾的 URL,并从其末尾删除所有斜杠:

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

注意:目前接受的答案仅适用于 http 而不是 https,但这个适用于两者。

【讨论】:

@steve 完整的答案显然值得等待。 我已经刷新了这个页面 2 年多了,现在正在等待答案......这是我在网站上线之前需要做的最后一件事...... 隔了这么久今天才注意到这一点。也许我不应该澄清来幽默其他读者:) 正则表达式应至少匹配/ 之前的一个字符,因此\(.+)/+$,否则在请求/ 时会出现无限重定向循环。【参考方案4】:

这是一个基于 mod-alias 的解决方案,用于从 url 中删除尾部斜杠:

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

您可以在 htaccess 或 server.config 文件中使用上述重定向。

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

【讨论】:

这对我有用,aleemb 的回答没有用,因为我使用的是虚拟主机。【参考方案5】:

如果您只想从 GET 请求中删除尾部斜杠,请使用以下命令:

RewriteCond %REQUEST_METHOD =GET
RewriteRule ^(.*)/$ /$1 [L,R=301]

【讨论】:

以上是关于mod_rewrite:删除尾部斜杠(只有一个!)的主要内容,如果未能解决你的问题,请参考以下文章

重写以添加尾部斜杠,但独立于域?

从批处理文件输入中删除尾部斜杠

使用 .htaccess 删除尾部斜杠

删除尾部斜杠重定向循环

从每个参数中删除尾部斜杠的最简单方法是啥?

Htaccess:从URL添加/删除尾部斜杠