通过.htaccess从URL中删除双重或更多斜杠的问题

Ran*_*ana 11 url .htaccess slash

我使用以下htaccess rul从web url中删除两个或多个斜杠:

#remove double/more slashes in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

这对于在uris中间发生的斜线很好,例如,如果使用url:

http://demo.codesamplez.com/html5//audio
Run Code Online (Sandbox Code Playgroud)

它被重定向到适当的单一slahs url:

http://demo.codesamplez.com/html5/audio

但是如果url在开头包含双斜杠,那么只是在域名之后,那么它就不起作用了,例如:

http://demo.codesamplez.com//html5/audio
Run Code Online (Sandbox Code Playgroud)

它没有被重定向.

我如何修复上述规则以适用于此类网址?谢谢.

Mar*_*cel 16

尝试一下:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) $1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

它应该重定向到域末尾的单个斜杠.而你的改进:

RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=301,L]
Run Code Online (Sandbox Code Playgroud)


Sim*_*mon 8

对我来说,以下规则非常有效:

<IfModule mod_rewrite.c>
    RewriteBase /

    # rule 1: remove multiple leading slashes (directly after the TLD)
    RewriteCond %{THE_REQUEST} \s/{2,}
    RewriteRule (.*) $1 [R=301,L]

    # rule 2: remove multiple slashes in the requested path
    RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
    RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

这个想法在很大程度上基于 Marcels 的回答(谢谢!),但这个更轻量级并包含RewriteBase,如果您使用特定的子目录结构,这可能会有所帮助。此外,Marcels 的回答缺乏解释,我想解决这个问题:

规则 1:{THE_REQUEST}包含类似的内容GET /index.html HTTP/1.1(参见文档)。因此,如果我们匹配第一个空格 ( \s) 后跟多个斜杠 ( /{2,}),我们可以通过$1.

规则 2:正则表达式^(.*)/{2,}(.*)$在多个斜杠上拆分请求 URI。%1/%2然后再次组合两个拆分的字符串,但此时只有一个斜线。


小智 5

根据 链接,以下代码应注意 URL 中的额外斜杠(任何地方)。

RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ $0 [R=302,L,NE]
Run Code Online (Sandbox Code Playgroud)

  • 如果_查询字符串_中的任何位置出现多个斜杠,则正则表达式“//”将创建一个重定向循环(与“THE_REQUEST”相比)。链接的答案已更新为使用 `\s[^?]*//` - 这确保多个斜杠仅在 URL 路径中匹配,而不是在查询字符串(如果存在)中匹配。 (3认同)