Come eseguire il debug di Apache mod_rewrite


171

Ho due problemi principali con mod_rewrite:

1) Non ci sono errori significativi segnalati quando ho una regola non valida

inserisci qui la descrizione dell'immagine

2) Per testare in modo affidabile ogni modifica, devo cancellare la cache di Chrome. Questa non è scienza missilistica, ma devo premere Ctrl + Maiusc + Canc quindi fare clic su OK, quindi chiudere la finestra e ricaricare.

Mi piacerebbe vedere se qualcuno dei guru è disposto a condividere i loro segreti per gestire in modo efficiente il codice mod_rewrite.


1
Puk, vedi stackoverflow.com/questions/9153262/… dove discuto alcuni dei trucchi di Stanleyard.
TerryE

Risposte:


283

Un trucco è attivare il registro di riscrittura. Per accenderlo, prova queste righe nella configurazione principale di apache o nel file host virtuale corrente ( non in .htaccess):

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

Da Apache httpd 2.4 mod_rewrite le direttive RewriteLog e RewriteLogLevel sono state completamente sostituite dalla nuova configurazione di registrazione per modulo.

LogLevel alert rewrite:trace6

81
Non puoi metterlo in .htaccess. Devi inserirlo nella configurazione di VirtualHost.
Attila Szeremi,

7
Devi avere anche la RewriteEngine Onsezione lì perché se la abiliti solo (come ho fatto io) nel .htaccessfile, allora nulla verrà registrato.
chacham15

12
dove si trova il file di registro in apache 2.4?
Charles John Thompson III,

4
Troverai gli elementi del registro 2.4 nel relativo registro degli errori. Questo può dipendere dalla tua configurazione, ma le impostazioni predefinite di Debian / Ubuntu li hanno in /var/log/apache2/error.log
Josiah

10
Suggerimento professionale: ricordati di disattivare la registrazione della riscrittura. Se dimentichi, riempirai il tuo hard disk abbastanza rapidamente, specialmente su un server di produzione.
John Hunt,

132

La direttiva LogRewrite menzionata da Ben non è più disponibile in Apache 2.4. È invece necessario utilizzare la direttiva LogLevel. Per esempio

LogLevel alert rewrite:trace6

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


22
dove è associato il file di registro?
Charles John Thompson III,

8
@CharlesJohnThompsonIII - Il file di registro è il registro degli errori (specificato dalla direttiva ErrorLog). Per i documenti, puoi ottenere solo i messaggi di riscrittura con grep:tail -f error_log|fgrep '[rewrite:'
billynoah

1
non dimenticare di riavviare apache
Accountant م

1
Ho dovuto assicurarmi che AllowOverridefosse impostato su All!
Michael,

25

Per una risoluzione URL di base, utilizzare un fetcher da riga di comando come wgeto curlper eseguire il test, anziché un browser manuale. Quindi non è necessario cancellare la cache; basta fare clic sulla freccia ed entrare in una shell per rieseguire i recuperi del test.


14
Un altro trucco è utilizzare Chrome "Modalità porno" (Ctl + Shift + N). Quando si chiude la finestra, viene inserito nel cestino qualsiasi contesto di sessione memorizzato nella cache.
TerryE

Penso che anche la navigazione "sessione privata" di Firefox. Ma stai dicendo che questo contesto è per singola finestra (quindi non stai chiudendo Chrome?)
Kaz

2
AFAIK, Chrome e Ff sono diversi in quanto Ff funziona come un singolo processo che è in modalità privata o meno. Con Chrome, ogni scheda o finestra viene eseguita come un processo separato e può essere individualmente in modalità privata; chiudi una finestra / scheda privata e il suo contesto viene eliminato.
TerryE

1
L'addon PrivateTab per FF fa la cosa. Ogni scheda funziona individualmente.
Javid,

Questo metodo mostra anche i reindirizzamenti! Piacevole per qualcuno che non ha accesso al file di configurazione di apache della macchina.
Geof Sawaya,

14

C'è il tester htaccess .

Mostra quali condizioni sono state testate per un determinato URL, quali soddisfacevano i criteri e quali regole venivano eseguite.

Sembra avere alcuni difetti, però.


2
Per me ha mostrato una regola eseguita in verde nell'ultima riga senza alcun codice.
Andy,

@thombr puoi essere più preciso, per favore? Il link non funziona? O lo strumento? Cosa non funziona esattamente? E perché è rilevante nel contesto di questa domanda?
Andy,

1
Questo mi dice che l'URL viene trasformato come previsto ... tuttavia sul server effettivo sto ricevendo un 404
Michael

@michael è la regola testata l'unica presente nella tua configurazione? Mod_rewrite è effettivamente installato e attivo?
Andy,

Si scopre che le sostituzioni non sono state abilitate
Michael,

3

Basato sulla risposta di Ben potresti fare quanto segue quando esegui apache su Linux (Debian nel mio caso).

Innanzitutto creare il file rewrite-log.load

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

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

Quindi entra

$ a2enmod rewrite-log

seguito da

$ service apache2 restart

E quando hai finito con il debug delle tue regole di riscrittura

$ a2dismod rewrite-log && service apache2 restart


Questo non ha funzionato. Ottengo sandino @ envy: ~ $ sudo service apache2 restart * Riavvio del server web apache2 [fail] * La configurazione di apache2 non è riuscita. L'output del test di configurazione è stato: AH00526: errore di sintassi sulla riga 1 di /etc/apache2/mods-enabled/rewrite-log.load: comando non valido 'RewriteLog', forse errato o definito da un modulo non incluso nella configurazione del server
sandino

3
@sandino, quale versione di Apache stai utilizzando? Sembra che questa sintassi sia stata modificata per 2.4, utilizzare invece: LogLevel warn rewrite:trace8o LogLevel info rewrite:trace8dove 8 può essere qualsiasi numero compreso tra 1-8
insaner
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.