2011-10-18 13 views
6

Este es un caso de "hacer una pregunta y responderla yo mismo", que estoy publicando para el beneficio de cualquier persona que tenga el mismo problema.¿Cómo puedo depurar las reglas de mod_rewrite?

Tuve algunos problemas para depurar un conjunto de reglas mod_rewrite en un archivo .htaccess en un servidor compartido, donde ni siquiera podía acceder a los registros de errores de Apache. He encontrado una manera ordenada para depurarlos, que es la siguiente:

  1. escribir un guión corto que imprime simplemente se querystring variables. p.ej. en PHP:

    <?='<pre>',htmlentities(print_r($_GET,true)),'</pre>'?> 
    

    es todo lo que necesita.

  2. Digamos que usted nombra este script "show.php" y lo coloca en/public_html. Luego, en su archivo .htaccess, identificar el punto en su conjunto de reglas que usted piensa que podría estar causando el problema, e insertar esta regla:

    RewriteRule (.*) /show.php?url=$1 [END] 
    

el efecto es el mismo que la inserción de una instrucción PRINT en un habitual programa. Le informará que (a) llegó a ese punto en el conjunto de reglas, y (b) cuál es la URL reescrita actual.

No es tan rápido como una verdadera herramienta de depuración, pero hace el trabajo bien.

Si está utilizando Apache < 2.3.9, tendrá que usar [L] en lugar de [END]. En ese caso, hay que tener en cuenta que su conjunto de reglas no debe intentar reescribir "/show.php" a cualquier otra cosa. Si eso es un problema, lo puede solucionar mediante la adición de esta regla en la parte superior:

RewriteRule ^show.php$ - [L] 

... Sólo recuerde que debe hacerlo cuando haya terminado de depurar!

+0

Más técnicas útiles son [aquí] (http://stackoverflow.com/questions/9153262/tips-for-debugging-htaccess-rewrite-rules). – Doin

Respuesta

4

muy útil visión. Durante años he estado intentando descubrir cómo depurar las reglas de mod_rewrite sin necesidad de tener acceso a la raíz y tener que poner las reglas en httpd.conf. Esto lo hace!

Tiene un pequeño error en su PHP:

<?='<pre>',htmlentities(print_r($_GET),true),'</pre>'?> 

En este código, print_r() muestra todo en $ _GET a la salida estándar y luego devuelve el valor verdadero, que htmlentities() recoge como su primer argumento. htmlentities() también recibe el literal verdadero como su segundo argumento, que es un argumento opcional que le dice a htmlentities() si debe o no mezclarse con comillas simples y/o dobles.

creo que lo que pretendía era:

<?='<pre>',htmlentities(print_r($_GET, true)),'</pre>'?> 

Esto le dice print_r() para formatear todo en $ _GET. Pasando true como el segundo argumento para print_r() le dice que no envíe el resultado a stdout, sino que ponga el resultado en una cadena y devuelva esa cadena como el valor de retorno de print_r().htmlentities() luego recibe esa cadena como su único parámetro de entrada, y realiza las sustituciones apropiadas para forzar al navegador a mostrar la cadena como está en lugar de permitir que el navegador interprete la cadena. P.EJ. -

<i>text</i> 

obtendría traducida a:

&lt;i&gt;text&lt;/i&gt; 

lo que hará que el navegador para visualizar:

<i>text</i> 

en lugar de mostrar la palabra "texto" en cursiva:

texto

+0

¡Egad! ¡Tienes razón! Está arreglado ahora. Gracias por atrapar eso. – Doin

Cuestiones relacionadas