La reescritura de htaccess no funciona para todas las reglas
-
06-07-2019 - |
Pregunta
Este es un problema muy extraño, y solo espero poder explicarlo claramente.
Básicamente, hicimos una actualización importante en el sitio de un cliente hoy, y necesitábamos actualizar algunas reglas de reescritura en htaccess para acomodar la nueva estructura, etc. ...
Entonces, donde originalmente teníamos cosas como:
RewriteRule ^/resources/?$ index.php?id=resources
RewriteRule ^/media/?$ media.php
Cambiamos a:
RewriteRule ^/resources/?$ index.php?id=resources
RewriteRule ^/media/?$ index.php?id=media
Pero cuando visitamos http://www.example.com/media - se estaba mostrando La antigua página de medios. Luego, cuando eliminamos el viejo media.php de la raíz del documento, obtuvimos 404s. Algo en algún lugar todavía está asignando / media a media.php, e ignorando la regla de reescritura.
Lo extraño es que todas las demás reglas de reescritura en el archivo funcionan bien, y hay alrededor de 20 más o menos allí.
Hemos rastreado arriba y abajo del vhost y otros archivos de configuración, pero no podemos encontrar ninguna referencia a los medios u otras redirecciones rotas (tres en total), por lo que estamos perplejos.
Solución 2
Desactivar la opción MultiViews en el sitio .htaccess solucionó el problema; parecía que esto permitía la negociación de contenido que se procesaba antes de las reglas de reescritura.
Otros consejos
Sospecho firmemente que esto se debe a AcceptPathInfo, que en mi opinión es una característica errónea de Apache. Por defecto, creo que está activado donde PHP es el controlador.
Intente agregar a su .htaccess, o preferiblemente a su httpd.conf (y reinicie):
AcceptPathInfo Off
Ver: http://httpd.apache.org/docs /2.2/mod/core.html#acceptpathinfo
-
Algunos puntos secundarios:
Debe asegurarse de que sus RewriteRules siempre terminen con [L] cuando haya encontrado una coincidencia; esto ayudará en la depuración. Por ejemplo:
RewriteRule ^/media/?$ index.php?id=media [L]
Además, podría reducir la cantidad de reglas combinando reglas similares; por ejemplo:
RewriteRule ^/(media|resources)/?$ index.php?id=$1 [L]
Personalmente creo que el uso de /? al final de su primera mitad no es bueno, porque significa que ambas URL funcionan, sin redireccionamiento, lo que significa que no tiene una definitiva que sea 'correcta'. Personalmente usaría:
RewriteRule ^/(media|resources)/$ index.php?id=$1 [L]
RewriteRule ^/(media|resources)$ /$1/ [L,R]
En otras palabras, un recurso único debe tener una única URL canónica (definitiva).