Apache codificando URI causando 404s

1

Este é um problema estranho que estou tendo. Eu estou usando uma estrutura que é chamada depois que o mod_rewrite reescreve a URL. Se um caractere no URI é acentuado, como no alfabeto latino, a solicitação nunca é enviada para minha estrutura, mas sim, o servidor com um erro 404. Estou usando uma máquina Windows, portanto, não tenho certeza se isso tem algo fazer com isso ou não. Contanto que não haja caracteres acentuados no URI, a solicitação será enviada para a estrutura sem nenhum problema. Alguém pode me dizer o que está acontecendo aqui e como resolver isso?

EDIT: Aqui estão 2 linhas do meu access.log. A primeira linha mostra o 404 onde o Å acentuado foi codificado pelo Apache e não foi passado. Quando eu mudo o Å no URI para um inglês "A", tudo funciona como esperado.

127.0.0.1 - - [20/Oct/2017:13:50:50 -0400] "GET /actor/%C3%85ker HTTP/1.1" 404 222
127.0.0.1 - - [20/Oct/2017:13:54:48 -0400] "GET /actor/Aker HTTP/1.1" 200 5701

EDITAR: Estas são as linhas no arquivo .htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?request=$1 [L,QSA]

Isso faz parte de um log de depuração que consiste em duas pessoas, o que mostra que, para uma delas, o mod_rewrite não está encaminhando a solicitação para a minha estrutura, mas a outra é.

Este é o que falha:

[Fri Oct 20 17:52:48.119655 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52846] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1fec230/initial] [perdir C:/Development/Apache24/htdocs/ansac/] add path info postfix: C:/Development/Apache24/htdocs/ansac/actor -> C:/Development/Apache24/htdocs/ansac/actor/\xc3\x85kerman, referer: http://ansac.com/
[Fri Oct 20 17:52:48.119655 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52846] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1fec230/initial] [perdir C:/Development/Apache24/htdocs/ansac/] strip per-dir prefix: C:/Development/Apache24/htdocs/ansac/actor/\xc3\x85kerman -> actor/\xc3\x85kerman, referer: http://ansac.com/
[Fri Oct 20 17:52:48.119655 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52846] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1fec230/initial] [perdir C:/Development/Apache24/htdocs/ansac/] applying pattern '^(.*)$' to uri 'actor/\xc3\x85kerman', referer: http://ansac.com/
[Fri Oct 20 17:52:48.119655 2017] [rewrite:trace1] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52846] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1fec230/initial] [perdir C:/Development/Apache24/htdocs/ansac/] pass through C:/Development/Apache24/htdocs/ansac/actor, referer: http://ansac.com/

Estranhamente, este funciona:

[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] add path info postfix: C:/Development/Apache24/htdocs/ansac/actor -> C:/Development/Apache24/htdocs/ansac/actor/Gonz\xc3\xa1lez
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] strip per-dir prefix: C:/Development/Apache24/htdocs/ansac/actor/Gonz\xc3\xa1lez -> actor/Gonz\xc3\xa1lez
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] applying pattern '^(.*)$' to uri 'actor/Gonz\xc3\xa1lez'
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace4] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] RewriteCond: input='C:/Development/Apache24/htdocs/ansac/actor' pattern='!-f' => matched
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace4] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] RewriteCond: input='C:/Development/Apache24/htdocs/ansac/actor' pattern='!-d' => matched
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace2] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] rewrite 'actor/Gonz\xc3\xa1lez' -> 'index.php?do=actor/Gonz\xc3\xa1lez'
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] split uri=index.php?do=actor/Gonz\xc3\xa1lez -> uri=index.php, args=do=actor/Gonz\xc3\xa1lez
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] add per-dir prefix: index.php -> C:/Development/Apache24/htdocs/ansac/index.php
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace2] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] strip document_root prefix: C:/Development/Apache24/htdocs/ansac/index.php -> /index.php
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace1] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] internal redirect with /index.php [INTERNAL REDIRECT]
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ffd7c0/initial/redir#1] [perdir C:/Development/Apache24/htdocs/ansac/] strip per-dir prefix: C:/Development/Apache24/htdocs/ansac/index.php -> index.php
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ffd7c0/initial/redir#1] [perdir C:/Development/Apache24/htdocs/ansac/] applying pattern '^(.*)$' to uri 'index.php'
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace4] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ffd7c0/initial/redir#1] [perdir C:/Development/Apache24/htdocs/ansac/] RewriteCond: input='C:/Development/Apache24/htdocs/ansac/index.php' pattern='!-f' => not-matched
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace1] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ffd7c0/initial/redir#1] [perdir C:/Development/Apache24/htdocs/ansac/] pass through C:/Development/Apache24/htdocs/ansac/index.php

Por que um trabalha e não o outro? Ambos os nomes têm sotaque neles, mas um falha.

    
por Jim 20.10.2017 / 19:37

2 respostas

1

Uma hipótese ...

RewriteRule .* index.php?request=$1 [L,QSA]

Esta linha parece como um erro, uma vez que a referência de% $1 estará sempre vazia, pois não há grupo capturado no padrão RewriteRule .

O "framework" ainda pode funcionar (para o alfabeto latino) porque pode estar analisando o superglobal $_SERVER['REQUEST_URI'] PHP (como um fallback talvez) - o que muitos frameworks fazem. No entanto, $_SERVER['REQUEST_URI'] permanecerá codificado em URL (por exemplo, /actor/%C3%85ker ) - então, provavelmente, ele precisa ser decodificado por URL (por exemplo, /actor/Åker ) antes de poder ser roteado por meio de sua estrutura. Isso pode ser onde está o problema. Uma solicitação como /actor/Aker , por outro lado, é a mesma, seja ela codificada ou não, portanto, isso não afetaria URLs como esse.

No entanto, se sua estrutura permitir que a URL solicitada seja substituída pelo parâmetro request URL, considere alterar a diretiva acima para:

 RewriteRule (.*) index.php?request=$1 [L,QSA]

ie. coloque o padrão RewriteRule entre parênteses.

Isso fará com que o caminho da URL capturado seja passado no parâmetro request URL. Agora, a diferença importante com isso é que o caminho de URL com o qual a diretiva RewriteRule corresponde já está decodificado por URL. Portanto, o parâmetro request URL já contém a solicitação decodificada por URL (embora menos o prefixo de barra), por exemplo. actor/Åker .

UPDATE: Tente alterar o padrão RewriteRule de .* para [\s\S]* . Por exemplo:

 RewriteRule ([\s\S]*) index.php?request=$1 [QSA,L]

Este é apenas um padrão ligeiramente mais abrangente. Embora . (ponto) corresponda a qualquer caractere (excluindo novas linhas), [\s\S] corresponde a qualquer espaço em branco e a quaisquer caracteres que não sejam espaços em branco (ou seja, tudo ).

    
por 20.10.2017 / 22:01
0
  1. Procure nos seus registros. Qual é o caminho para o arquivo que o Apache log de erro diz que está procurando? Este caminho para este arquivo existe?

  2. Isso soa como um problema de codificação de caracteres. Assegure o personagem A codificação é configurada no Apache apropriadamente. Infelizmente, eu não tem uma recomendação específica para isso.

por 20.10.2017 / 19:54