Apache como encontrar a causa de 404 com reescrita ignorada

Apache como encontrar a causa de 404 com reescrita ignorada

Então eu tenho isso

RewriteCond %{REQUEST_URI} (da-dk)/(.*)(/|\.php)$
RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

Mas, por alguns motivos, example.com/da-dk/ fornece "404 - não encontrado"

Eu gostaria de tentar entender por que o Apache chega a essa conclusão - ou seja, quais regras ele encontrou e seguiu

Responder1

Supondo que isso esteja no .htaccessarquivo raiz ...

RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

Uma solicitação para /da-dk/(que corresponde ao URL-path da-dk/) não corresponde ao regex, ^(da-dk)/(.*)(/|\.php)$portanto esta regra não é processada/seguida.

Então, a menos que você tenha outras regras que correspondam a esta solicitação,nãoregras são seguidas, daí o 404. (Quanto a quais regras são "encontradas", bem, todas as outras regras que você tem sãoencontrado.)

Aliás, o precedentedoença( RewriteConddiretiva) é totalmente supérflua aqui e deve ser removida. Não é fazer mais nada do que o queRewriteRule padrãojá estabeleceu.

Especificamente, esta regra (regex) corresponderia a URLs no formato:

  • /da-dk/.php
  • /da-dk/<foo>/
  • /da-dk/<foo>.php
  • /da-dk/<foo>/<bar>/<baz>/
  • /da-dk/<foo>/<bar>/<baz>.php

Não corresponde:

  • /da-dk/<foo>
  • /da-dk/

Esta regra simplesmente remove o /da-dkprefixo do URL solicitado (presumivelmente noter esperançaque o URL reescrito corresponda a um diretório ou arquivo do sistema de arquivos).

Se /da-dk/for reescrita de volta à raiz, a regra acima pode ser modificada para permitir isso (no processo, ela também pode ser ligeiramente simplificada). Por exemplo, tente o seguinte:

RewriteRule ^da-dk/(.+(/|\.php))?$ /$1 [L]

Aqui, a parte do caminho da URL depois da-dk/é feitaopcional. (Neste caso, a $1referência anterior é efetivamentevazio.)

Ao alterar o quantificador de *para +isso também evita a correspondência com o (absurdo) URL /da-dk/.php.

Não precisa decapturarparte da-dk(primeiro segmento do caminho), já que este não está sendo utilizado nosubstituiçãostring (2º argumento).

A $1referência anterior agora contém todo o caminho da URL após o da-dk/prefixo. (Não há necessidade de $2e $3como você tinha originalmente.)

informação relacionada