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.

puk
fuente
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
Ben
fuente
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

Tobias Schultze
fuente
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.

Kaz
fuente
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.

Andy
fuente
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

Fluir
fuente
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