Por que RewriteRule para “^//(.*)” (começa com barra dupla) não redireciona para uma única barra?

Aug 17 2020

Tenha esta regra de reescrita no contexto do vHost. Mas não reescreve solicitações que começam com //.*(barra dupla). Apenas os exibe de /.*(barra simples) em vez de responder com um redirecionamento para/.*

RewriteRule "^//(.*)" "/$1" [R=301,L]

Por que isso não funciona?

Respostas

2 MrWhite Aug 18 2020 at 06:51
RewriteRule "^//(.*)" "/$1" [R=301,L]

Isso nunca corresponderá porque o caminho de URL ao qual o RewriteRule padrão corresponde já teve todas as instâncias de várias barras reduzidas a uma única barra.

Para redirecionar essas solicitações, você pode usar esse "recurso" e simplesmente redirecionar "para si mesmo" e verificar a THE_REQUESTvariável do servidor para determinar se várias barras estavam presentes na solicitação inicial. THE_REQUESTé a primeira linha do cabeçalho da solicitação e contém a URL bruta da solicitação não processada (excluindo o protocolo e o nome do host, mas incluindo a string de consulta) enviada do cliente.

Por exemplo, para redirecionar todas as instâncias de várias barras para uma única barra em todo o caminho da URL, não apenas no início, você pode fazer algo assim:

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

O regex \s[^?]*//garante que não correspondamos a várias barras na parte da string de consulta do URL (o que, de outra forma, resultaria em um loop de redirecionamento).


Nos RewriteCond %{THE_REQUEST} ^//permitiria aplicar a regra de reescrita apenas para aqueles que começam com barras duplas, ignorando todas as outras instâncias de barras duplas?

Não é bem assim, THE_REQUESTa variável do servidor na verdade contém toda a primeira linha do cabeçalho da solicitação HTTP. Em outras palavras, uma string da forma:

GET /foo/bar.html HTTP/1.1

Ou GET //foo/bar.html HTTP/1.1se houver uma barra dupla no início do caminho do URL, você precisará de algo assim:

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

...a fim de capturar todos os métodos de solicitação. E especificamente apenas uma barra dupla, não barras triplas, etc. apenas no início do caminho da URL.

\s//[^/]- Isso é um espaço (após o método de solicitação ) seguido por 2 barras e algo diferente de uma barra (ou seja, um espaço para a raiz do documento ou algum outro caminho de URL).