.htaccess redireciona para o destino errado

3

Eu tenho uma pilha LAMP. Estou usando o seguinte arquivo .htaccess para mapear automaticamente solicitações para arquivos .php:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Então, se eu navegar até o link , o arquivo "asdf.php" será carregado.

No entanto, se eu criar um arquivo .css com o mesmo nome (ou seja, "asdf.css"), o servidor retornará o arquivo css em vez do arquivo PHP ao navegar até o nome sem extensão. Também parece acontecer para extensões de arquivo .txt e, provavelmente, qualquer outra extensão de três caracteres (embora NÃO aconteça para arquivos .js).

Não consigo entender por que isso está acontecendo. Minha compreensão do conjunto de regras de reescrita é esta: 1) se o arquivo solicitado não existe ENTÃO 2) se o nome do arquivo NÃO contiver um ponto, redirecione o pedido para [nome do arquivo] .php

Como isso pode retornar um arquivo .txt ou .css, especialmente quando o arquivo .php correspondente existe? O que estou perdendo aqui?

Obrigado!

    
por Ryan Griggs 26.05.2017 / 20:50

1 resposta

2

Se você tem vários arquivos com o mesmo basename , então parece que você pode ter um conflito com MultiViews . Tente desabilitar isso no seu arquivo .htaccess (ou configuração do servidor):

Options -MultiViews

MultiViews (parte de mod_negotiation) faz o mesmo tipo de coisa que você está tentando fazer com o mod_rewrite e eu suspeito que esteja "ganhando". Quando você solicita /asdf e asdf mapas a um nome de arquivo, o MultiViews tenta veicular um arquivo apropriado que corresponda ao tipo mime pretendido (o que pode explicar por que .js arquivos foram perdidos).

My understanding of the rewrite ruleset is this: 1) if the file being requested doesn't exist THEN 2) if the filename does NOT contain a period, redirect the request to [filename].php

Caso contrário, sua compreensão das diretivas mod_rewrite está bem correta, exceto que a ordem é inversa (o padrão RewriteRule é processado primeiro) ...

  1. Se o URL (o URL inteiro) não contiver um ponto.
  2. E a solicitação não é mapeada para um arquivo válido (é improvável que todos os seus arquivos tenham extensões de arquivo - portanto, talvez essa condição possa ser omitida).
  3. Reescreva internamente a solicitação adicionando uma extensão .php .
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Não há necessidade de escapar de um período literal em uma classe de caracteres, e a sinalização NC é supérflua aqui.

    
por 26.05.2017 / 20:59