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.

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top