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

时间:2013-06-13 06:34:43

标签: .htaccess url slash

我正在使用以下htaccess rul从网址中删除两个或多个斜杠:

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

这适用于uris中间发生的斜线,例如,如果使用url:

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

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

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

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

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

没有被重定向。

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

5 个答案:

答案 0 :(得分:14)

尝试使用:

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

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

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

答案 1 :(得分:2)

对我来说,以下规则完美无缺:

<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>

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

规则1:{THE_REQUEST}包含GET /index.html HTTP/1.1之类的内容(请参阅docs)。因此,如果我们匹配第一个空格(\s)后跟多个斜杠(/{2,}),我们可以通过$1访问没有前导双斜杠的正确网址。

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

答案 2 :(得分:1)

防止网址中长时间重复出现字符,例如:

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

你可以这样做:

RewriteCond %{REQUEST_METHOD}  !=POST
RewriteCond %{REQUEST_URI} ^(.*?)(/{2,})(.*)$
RewriteRule . %1/%3 [R=301,L]

它适用于:

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

另见:.htaccess - how to remove repeated characters from url?

答案 3 :(得分:0)

根据this 链接,下面的代码应该处理URL中的额外斜杠(任何地方)。

RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ $0 [R=302,L,NE]

答案 4 :(得分:0)

只需将以下代码放入您的 .htaccess 文件中即可。 它将从任何地方删除多个斜线。在 url 的末尾和 url 的中间。

<IfModule mod_rewrite.c>
RewriteBase /`enter code here`
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule ^.*$ /$0 [R=302,L,NE]
#Remove slash anywhere from url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
# 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`enter code here`
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>