2011-10-18 30 views
6

Questo è un caso di "fai una domanda e rispondi da solo", che sto pubblicando a beneficio di chiunque abbia lo stesso problema.Come posso eseguire il debug delle regole mod_rewrite?

Ho avuto alcuni problemi nel debug di un set di regole mod_rewrite in un file .htaccess su un server condiviso, dove non potevo nemmeno accedere ai log degli errori di Apache. Ho trovato un modo pulito per eseguire il debug di loro, che è questo:

  1. Scrivi un breve script che stampa semplicemente è querystring variabili. per esempio. in PHP:

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

    è tutto ciò che serve.

  2. Diciamo che si chiama questo script "show.php" e lo si inserisce in/public_html. Poi, nel file .htaccess, identificare il punto nel vostro set di regole che si pensa possa essere la causa del problema, e inserire questa regola:

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

L'effetto è lo stesso che l'inserimento di una dichiarazione stampa in un regolare programma. Ti farà sapere che (a) hai raggiunto quel punto nel set di regole, e (b) che cos'è l'URL riscritto corrente.

Non è così veloce come un vero strumento di debug, ma fa il lavoro.

Se si utilizza Apache < 2.3.9, sarà necessario utilizzare [L] anziché [END]. In tal caso, qualcosa da tenere in considerazione è che il tuo set di regole non dovrebbe tentare di riscrivere "/show.php" in qualcos'altro. Se questo è un problema, è possibile risolvere il problema con l'aggiunta di questa regola al vertice:

RewriteRule ^show.php$ - [L] 

... Basta ricordarsi di toglierlo quando hai finito il debug!

+0

Altre tecniche utili sono [qui] (http://stackoverflow.com/questions/9153262/tips-for-debugging-htaccess-rewrite-rules). – Doin

risposta

4

Molto utile intuizione. Per anni ho cercato di capire come eseguire il debug delle regole mod_rewrite senza bisogno di avere accesso root e di dover inserire le regole in httpd.conf. Questo lo fa!

Avete un piccolo errore in PHP:

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

In questo codice, print_r() emette tutto in $ _GET stdout e poi restituisce il valore vero, che htmlentities() raccoglie come primo discussione. htmlentities() riceve anche il letterale true come secondo argomento, che è un argomento facoltativo che dice a htmlentities() se fare o meno pasticci con virgolette singole e/o doppie.

penso che quello che intendeva era:

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

Questo dice print_r() per formattare tutto in $ _GET. Passando true come secondo argomento di print_r() si dice di non inviare il risultato allo stdout, ma di mettere il risultato in una stringa e restituire quella stringa come valore di ritorno di print_r().htmlentities() riceve quindi quella stringa come un parametro di input e apporta le sostituzioni appropriate per forzare il browser a visualizzare la stringa come invece di consentire al browser di interpretare la stringa. PER ESEMPIO. -

<i>text</i> 

otterrebbe tradotto in:

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

che farà sì che il browser per visualizzare:

<i>text</i> 

invece di visualizzare la parola "testo" in corsivo:

testo

+0

Egad! Hai ragione! È riparato ora. Grazie per averlo capito. – Doin

Problemi correlati