htaccess - Como contabilizar caracteres de espaço ao usar a notação literal?

3

Se eu tenho um url root.com/index rel que é codificado para root.com/index%20rel , como eu o direciono usando a notação literal htaccess?

= denota nação literal. Então eu faço algo parecido com isso

RewriteCond %{REQUEST_URI} =index rel
RewriteRule .* / [L,R=302,]

Mas o htaccess acha que o espaço torna as coisas um elemento extra ao invés de uma parte do mesmo parâmetro.

Escapar não parece funcionar

    
por ahnbizcad 14.09.2016 / 02:58

2 respostas

3

Ao usar uma comparação lexicográfica / literal (ou seja, = operator), você pode cercar todas as CondPattern entre aspas duplas se a string contiver um espaço. Por exemplo:

RewriteCond %{REQUEST_URI} "=index rel"

(A variável REQUEST_URI já está decodificada em porcentagem.)

No entanto, essa condição ainda não corresponderá, já que a variável REQUEST_URI começa com uma barra (diferente do caminho da URL que corresponde ao padrão RewriteRule ). Então, você precisaria:

RewriteCond %{REQUEST_URI} "=/index rel"

Mas, como sugere o Unbeliever, se possível você deve estar combinando este caminho de URL no padrão RewriteRule (que você também pode colocar entre aspas se preferir essa sintaxe). O padrão RewriteRule é processado primeiro, portanto, é mais eficiente fazer o que você pode lá, em vez de corresponder ao caminho da URL em uma condição .

UPDATE: Exemplo de trabalho testado no Apache 2.2 (Windows e Linux) e Apache 2.4 (Windows):

RewriteCond %{REQUEST_URI} "=/foo bar"
RewriteRule ^ /baz [R=302,L]

Uma solicitação para /foo%20bar é redirecionada para /baz .

    
por 14.09.2016 / 10:15
1

Tenho certeza que você não pode ter um espaço no padrão de destino ao usar comparações lexicais (ao contrário do PCRE), já que acho que o "escape" é algo que o PCRE interpreta. Além disso, você não precisa de RewriteCond , pois um RewriteRule corresponde ao URI da solicitação. Use o seguinte em vez disso:

RewriteRule ^index\ rel$ / [L,R=302]
    
por 14.09.2016 / 08:31