Cómo depurar Apache mod_rewrite


171

Tengo dos problemas principales con mod_rewrite:

1) No se informa un error significativo cuando tengo una regla no válida

ingrese la descripción de la imagen aquí

2) Para probar de manera confiable cada modificación, tengo que borrar el caché de Chrome. Esto no es ciencia espacial, pero tengo que presionar Ctrl + Shift + Delete y luego hacer clic en Aceptar, luego cerrar la ventana y volver a cargar.

Me gustaría ver si alguno de los gurús está dispuesto a compartir sus secretos para administrar eficientemente el código mod_rewrite.


1
Puk, mira stackoverflow.com/questions/9153262/... donde hablo de algunos de los trucos estándar.
TerryE

Respuestas:


283

Un truco es activar el registro de reescritura. Para activarlo, intente estas líneas en su configuración principal de apache o en el archivo de host virtual actual ( no en .htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Desde Apache httpd 2.4 mod_rewrite, las directivas RewriteLog y RewriteLogLevel se han reemplazado completamente por la nueva configuración de registro por módulo.

LogLevel alert rewrite:trace6

81
No puede poner esto en .htaccess. Tienes que ponerlo en la configuración de VirtualHost.
Attila Szeremi

77
También debe tener la RewriteEngine Onsección allí porque si solo la habilita (como lo hice) en el .htaccessarchivo, entonces no se registrará nada.
chacham15

12
¿Dónde se encuentra el archivo de registro en Apache 2.4?
Charles John Thompson III

44
Encontrará los elementos de registro 2.4 en el registro de errores relevante. Esto puede depender de su configuración, pero las configuraciones predeterminadas de Debian / Ubuntu las tienen en /var/log/apache2/error.log
Josiah

10
Consejo profesional: recuerde desactivar el registro de reescritura. Si olvida que llenará su disco duro con bastante rapidez, especialmente en un servidor de producción.
John Hunt

132

La directiva LogRewrite mencionada por Ben ya no está disponible en Apache 2.4. En su lugar, debe usar la directiva LogLevel. P.ej

LogLevel alert rewrite:trace6

Ver http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging


22
¿Dónde está el archivo de registro asociado con esto?
Charles John Thompson III

8
@CharlesJohnThompsonIII: el archivo de registro es el registro de errores (especificado por la directiva ErrorLog). Por documentos, puede obtener solo los mensajes de reescritura con grep:tail -f error_log|fgrep '[rewrite:'
billynoah

1
no olvide reiniciar apache
Contador م

1
¡Tenía que asegurarme de que AllowOverrideestaba configurado All!
Michael

25

Para la resolución básica de URL, use un buscador de línea de comandos como wgeto curlpara hacer la prueba, en lugar de un navegador manual. Entonces no tiene que borrar ningún caché; solo con la flecha hacia arriba e Intro en un shell para volver a ejecutar sus recuperaciones de prueba.


14
Otro truco es usar Chrome "Modo porno" (Ctl + Shift + N). Cuando cierra la ventana, cualquier contexto de sesión en caché se descarta.
TerryE

Creo que la navegación de "sesión privada" de Firefox también. ¿Pero estás diciendo que este contexto es por ventana individual (así que no estás cerrando Chrome?)
Kaz

2
AFAIK, Chrome y Ff son diferentes en que Ff se ejecuta como un proceso único que está en modo privado o no. Con Chrome, cada pestaña o ventana se ejecuta como un proceso separado y puede ser individualmente en modo privado; cierra una ventana / pestaña privada y su contexto se destruye.
TerryE

1
El complemento PrivateTab para FF hace lo mismo. Cada pestaña funciona individualmente.
Javid

¡Este método también muestra redireccionamientos! Agradable para alguien que no tiene acceso al archivo de configuración de apache de la máquina.
Geof Sawaya

14

Ahí está el probador de htaccess .

Muestra qué condiciones se probaron para una determinada URL, cuáles cumplieron los criterios y qué reglas se ejecutaron.

Sin embargo, parece tener algunos problemas técnicos.


2
Para mí, mostró una regla verde ejecutada en la última línea sin ningún código.
Andy

@thombr ¿puedes ser más preciso, por favor? ¿El enlace no funciona? O la herramienta? ¿Qué no funciona exactamente? ¿Y por qué es eso relevante en el contexto de esta pregunta?
Andy

1
Esto me dice que la URL se está transformando como se esperaba ... sin embargo, en el servidor real obtengo un 404
Michael

@michael ¿es la regla probada la única presente en su configuración? ¿Mod_rewrite está realmente instalado y activo?
Andy

Resulta que las anulaciones no estaban habilitadas
Michael

3

Según la respuesta de Ben, puede hacer lo siguiente al ejecutar apache en Linux (Debian en mi caso).

Primero cree el archivo rewrite-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Luego ingrese

$ a2enmod rewrite-log

seguido por

$ service apache2 restart

Y cuando termine de depurar sus reglas de reescritura

$ a2dismod rewrite-log && service apache2 restart


Esto no funcionó. Obtengo sandino @ envidia: ~ $ sudo service apache2 restart * Reinicio del servidor web apache2 [fail] * Falló la configuración de apache2. La salida de la prueba de configuración fue: AH00526: error de sintaxis en la línea 1 de /etc/apache2/mods-enabled/rewrite-log.load: comando no válido 'RewriteLog', quizás mal escrito o definido por un módulo no incluido en la configuración del servidor
sandino

3
@sandino, ¿qué versión de apache estás ejecutando? Parece que esta sintaxis se cambió para 2.4, use en su lugar: LogLevel warn rewrite:trace8o LogLevel info rewrite:trace8donde 8 puede ser cualquier número del 1 al 8
2014
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.