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:删除尾部斜杠(只有一个!)的主要内容,如果未能解决你的问题,请参考以下文章