【问题标题】:mod_rewrite: remove trailing slash (only one!)mod_rewrite:删除尾部斜杠(只有一个!)
【发布时间】: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

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

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

谢谢。

【问题讨论】:

标签: apache .htaccess mod-rewrite redirect rewrite


【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2012-09-25
      • 2015-06-20
      • 2015-01-15
      相关资源
      最近更新 更多