Apache cómo encontrar la causa del 404 con rewriterule ignorada

Apache cómo encontrar la causa del 404 con rewriterule ignorada

entonces tengo esto

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

Pero por algunas razones, example.com/da-dk/ muestra "404 - no encontrado"

Me gustaría intentar comprender por qué Apache llega a esa conclusión, es decir, qué reglas encontró y siguió.

Respuesta1

Suponiendo que esto esté en el .htaccessarchivo raíz...

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

Una solicitud de /da-dk/(que coincide con la ruta URL da-dk/) no coincide con la expresión regular, ^(da-dk)/(.*)(/|\.php)$por lo que esta regla no se procesa ni se sigue.

Entonces, a menos que tenga otras reglas que coincidan con esta solicitud, entoncesNoSe siguen las reglas, de ahí el 404. (En cuanto a qué reglas se "encuentran", bueno, todas las demás reglas que tienes sonencontrado.)

Por cierto, lo anteriorcondición( RewriteConddirectiva) es aquí completamente superflua y debería eliminarse. No está haciendo nada más de lo queRewriteRule patrónya ha establecido.

Específicamente, esta regla (regex) coincidiría con URL del formulario:

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

No concuerda:

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

Esta regla simplemente elimina el /da-dkprefijo en la URL solicitada (presumiblemente en elesperanzaque la URL reescrita coincida con un directorio o archivo del sistema de archivos).

Si /da-dk/se debe reescribir desde la raíz, entonces la regla anterior se puede modificar para permitir esto (en el proceso, también se puede simplificar ligeramente). Por ejemplo, intente lo siguiente en su lugar:

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

da-dk/Aquí, se hace la parte de la ruta URL posterior.opcional. (En este caso, la $1referencia retrospectiva es efectivamentevacío.)

Al cambiar el cuantificador de *a +this también se evita hacer coincidir la URL (sin sentido) /da-dk/.php.

No hay necesidad decapturala da-dkparte (primer segmento de ruta), ya que esto no se está utilizando en elsustitucióncadena (segundo argumento).

La $1referencia inversa ahora contiene la ruta URL completa después del da-dk/prefijo. (No es necesario $2y $3como lo tenía originalmente).

información relacionada