htaccess - 使用编码的重音字符删除域后的多个斜杠

时间:2014-02-02 16:48:57

标签: regex apache mod-rewrite

我可以使用以下方法删除URL中的任何位置的多个斜杠:

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

但它不适用于域

之后的多个斜杠

我试过了

RewriteCond %{HTTP_HOST} !=""
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR]
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L]

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

开始,

都会产生预期的重新制作

domain.com/////hello

domain.com/hello

但来自

 domain.com/////héllo

结果已编码

domain.com/h%25c%25allo

如何在域后删除多个斜杠时防止重音字符被编码?

编辑:梨到anubhava的回答

RewriteCond %{THE_REQUEST} \s/+(.*?)/{2,}([^\s]*) [NC]
RewriteRule ^ %1/%2 [R=301,L,NE]

重音字符受到保护,并且会有成功而不是重复斜线

domain.com////////héllo

但不只有2

domain.com//héllo

2 个答案:

答案 0 :(得分:2)

此规则适用于您:

RewriteEngine On
RewriteBase /

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

这将执行以下重定向:

  1. /////help => /help
  2. /////héllo/////abc/////123 => /héllo/abc/123

答案 1 :(得分:0)

anubhava的回答是最短的,但另一个也是有效的:

RewriteCond %{HTTP_HOST} !=""
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR]
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L,NE]