Molti poster hanno problemi con il debug delle loro dichiarazioni RewriteRule e RewriteCond all'interno dei propri .htaccess
file. La maggior parte di questi utilizza un servizio di hosting condiviso e pertanto non ha accesso alla configurazione del server principale. Non possono evitare di utilizzare i .htaccess
file per la riscrittura e non possono abilitare un RewriteLogLevel "come suggeriscono molti intervistati. Inoltre ci sono molte .htaccess
insidie specifiche e i vincoli non sono coperti bene. L'impostazione di uno stack LAMP di test locale comporta troppa curva di apprendimento per la maggior parte .
Quindi il mio Q ecco come se consigliamo che il debug loro regole stesse . Fornisco alcuni suggerimenti di seguito. Altri suggerimenti sarebbero apprezzati.
Comprendi che il motore mod_rewrite scorre ciclicamente i
.htaccess
file . Il motore esegue questo ciclo:do execute server and vhost rewrites (in the Apache Virtual Host Config) find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled if found(.htaccess) execute .htaccess rewrites (in the user's directory) while rewrite occurred
Quindi le tue regole verranno eseguite ripetutamente e se cambi il percorso URI, potrebbe finire per eseguire altri
.htaccess
file se esistono. Quindi assicurati di terminare questo ciclo, se necessario aggiungendo ulterioreRewriteCond
per fermare l'attivazione delle regole. Eliminare anche qualsiasi.htaccess
set di regole di riscrittura di livello inferiore a meno che non si intenda esplicitamente utilizzare set di regole a più livelli.Assicurati che la sintassi di ogni Regexp sia corretta testando una serie di schemi di test per assicurarti che sia una sintassi valida e faccia quello che intendi con una gamma completa di URI di test. Vedi la risposta sotto per maggiori dettagli.
Costruisci le tue regole in modo incrementale in una directory di test. È possibile utilizzare il "Esegui il
.htaccess
file più profondo sulla funzionalità del percorso" per impostare una directory di test separata (albero) e impostare le regole di debug qui senza rovinare le regole principali e interrompere il funzionamento del sito. Devi aggiungerli uno alla volta perché questo è l'unico modo per localizzare gli errori alle singole regole.Utilizzare uno stub di script fittizio per scaricare le variabili di server e di ambiente . (Vedi il Listato 2 ) Se la tua app utilizza, ad esempio,
blog/index.php
puoi copiarlatest/blog/index.php
e utilizzarla per testare le regole del tuo blog nellatest
sottodirectory. È inoltre possibile utilizzare le variabili di ambiente per assicurarsi che il motore di riscrittura interpreti correttamente le stringhe di sostituzione, ad esRewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
e cerca queste variabili REDIRECT_ * nel dump phpinfo. A proposito, ho usato questo e ho scoperto sul mio sito che dovevo usare
%{ENV:DOCUMENT_ROOT_REAL}
invece. Nel caso del redirector che esegue il looping le variabili REDIRECT_REDIRECT_ * elencano il passaggio precedente. Eccetera..Assicurati di non essere morso dal tuo browser che memorizza nella cache 301 reindirizzamenti errati . Vedi la risposta sotto . I miei ringraziamenti a Ulrich Palha per questo.
Il motore di riscrittura sembra sensibile alle regole a cascata all'interno di un
.htaccess
contesto (è qui che siRewriteRule
traduce in una sostituzione e questo rientra in ulteriori regole), poiché ho trovato bug con richieste secondarie interne (1) e un'elaborazione PATH_INFO errata che spesso può essere prevenuto dall'uso dei flag [NS], [L] e [PT].
Altri commenti o suggerimenti?
Listato 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);