mod_rewrite substitui / por _

1

Claro que estou sentindo falta de algo óbvio aqui, mas tenho isto:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ $1_$2 [N]
RewriteRule ^(.*)$ $1.php [QSA,L]

Que eu gostaria de reescrever / shop / basket para /shop_basket.php. Em vez disso, se eu vou para / eu recebo e erro interno do servidor, e se eu vou para / shop / cesta fica preso em um loop infinito.

Alguma idéia?

    
por Jack Sleight 27.02.2010 / 02:08

1 resposta

3

Tome IV: Não, Realmente, é isso!

Acabou sendo mais fácil do que eu pensava em me livrar de [DPI] . O conjunto final:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ $1_$2 [L]

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(.*)$ $1.php

Agora isso é aceitável? : -)

Tome III: A solução final (não tão)

Ok, depois de muito testes e bater o teclado, eu finalmente encontrei algo satisfatório. Eu definitivamente estou mantendo este caso eu volte ao Apache por algum motivo.

A lâmpada disparou na minha cabeça quando dividi o problema em duas partes: substitua / por _ ; em seguida, adicione .php no final. Aqui está o que eu finalmente consegui:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ $1_$2 [DPI,N]

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(.*)$ $1.php [QSA]

Agora, como mencionei acima, o mais importante foi dividir as duas operações. Depois disso, tudo ficou muito mais fácil. Os dois RewriteCond s são realmente legais, porque permitem que você acesse arquivos por seus nomes usuais, mesmo com todas as outras reescritas acontecendo.

Percebi que estava recebendo redirecionamento de caminho infinito (que o Apache não conseguiu detectar), como shop/basket_checkout/basket_checkout/basket/checkout ; Foi quando percebi que o próprio Apache estava anexando caminhos ao final do caminho substituído! Assim, [DPI] corrige isso.

O RewriteCond extra no segundo bloco deve ser óbvio: ele impede o redirecionamento infinito (ou seja, se foo.php estiver indisponível, não faz sentido tentar foo.php.php , etc).

Deixe-nos saber como isso funciona para você.

Take II: boa tentativa, mas sem dados

Opa, até mais simples do que eu pensava. Mude [N] para [C] e você está pronto para ir. Como a documentação de [N] diz:

Be careful not to create an infinite loop!

Qual é exatamente o que aconteceu aqui. ;-)
Eu quase tirei minha VM de teste na primeira tentativa - isso foi divertido!

No entanto, faz coisas estranhas quando o arquivo php não existe. Vou testar mais um pouco.

    
por 27.02.2010 / 02:45