Limpar URLS com reescrita de mod e caracteres codificados em URL causa 404?

Limpar URLS com reescrita de mod e caracteres codificados em URL causa 404?

Eu tenho um site usado mod_rewritepara obter alguns URLs limpos e páginas 404 personalizadas. Meu .htaccessarquivo está assim:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?clean_url=$1 [QSA,L]
</IfModule>

O que me intriga é que se a URL contiver um %2F(url-encoded /) o servidor parece forçar um 404. Por exemplo, http://example.com/category/articleseria um artigo normal, mas depois http://example.com/category%2farticlefornece uma página 404 gerada pelo servidor. (não a página 404 personalizada)

Eu não esperava isso... por que isso está acontecendo? Existe uma maneira de contornar isso?

Responder1

Os URLs http://example.com/category/articlee http://example.com/category%2farticlenão são iguais. De acordo comRFC 2616 §3.2.3, os caracteres reservados têm um significado especial (que é, afinal, o objetivo do escape de URL). RFC 2396 §2.2lista /como um caractere reservado. No contexto de URLs HTTP, /delimita os elementos do caminho, enquanto %2fé uma barra literal.

No Apache,AllowEncodedSlashes Onimpediria que a solicitação fosse imediatamente rejeitada com um 404.

informação relacionada