Prima ti dirò come leggere il vostro RewriteRule:
Si inizia con la prima (o successivo) RewriteRule entry:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Il primo parametro è un'espressione regolare che può corrispondere all'URL richiesto. ^(.*)$
corrisponde a tutto e memorizza questo "tutto" all'interno di una variabile che può essere utilizzata in seguito.
Solo se vi sono precedenti voci RewriteCond, vengono valutati seguente:
RewriteCond $1 !^(index\.php|resources|robots\.txt)
$1
è un riferimento al contenuto corrispondente all'interno delle prime parentesi RewriteRule. Questo viene confrontato con il secondo parametro, che è un'espressione regolare che indica diversi nomi espliciti e !
nega l'espressione, ad es. questa regola consente l'esecuzione di RewriteRule solo se la regex non corrisponde. Se questa condizione restituisce true, verrà esaminata la condizione successiva.
RewriteCond %{REQUEST_FILENAME} !-f
Se il nome del file richiesto non è vero file sul disco rigido, questa condizione è vero.
RewriteCond %{REQUEST_FILENAME} !-d
Se il nome del file richiesto non è directory reale, questa condizione è vero.
Solo se tutte queste condizioni sono vere (che sono incatenati insieme a E), torniamo alla regola di riscrittura:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Il risultato di questa fase di riscrittura è definito come il secondo e il terzo parametro. $1
viene utilizzato nuovamente come il contenuto della corrispondenza e i parametri definiscono che questa regola, se inizialmente associata, sarà l'ultima regola (L) e che qualsiasi stringa di query definita nella destinazione di riscrittura verrà aggiunta a qualsiasi stringa di query nell'URL originale (QSA).
Critica:
Il solito riscrittura per framework MVC cercare di essere il più performante possibile. Le tue condizioni di riscrittura devono essere tutte valutate per una riscrittura riuscita. Si interromperà solo se uno dei RewriteCond restituisce false. Ogni richiesta che viene riscritta è soggetta a numerosi test intensivi della CPU. Prima la reindirizzamento di RewriteRule, quindi l'espressione regolare nel primo RewriteCond, seguita da due test del disco rigido sul filesystem per l'esistenza dei file.
D'altra parte, il primo RewriteCond sembra non essere necessario. Verifica determinati nomi e, se trovato, interrompe la riscrittura. "index.php" dovrebbe essere rilevato dal secondo RewriteCond, perché è un file esistente (come funzionerebbe la riscrittura se non lo fosse). Tutto ciò che inizia con "risorse" verrà eguagliato, ma probabilmente non dovrebbe per gli stessi motivi: le risorse esistenti verranno trovate dal secondo RewriteCond. Ultimo il file "robots.txt". È sempre una buona idea averne uno, possibilmente inaffidabile se vuoi evitare 404 quando i robot recuperano il tuo sito.
Poiché non si modifica nulla nella stringa di query, la direttiva [QSA] non è necessaria.
Miglioramenti:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteRule ^.*$ index.php [L]
La prima RewriteRule corrisponderà l'intero percorso richiesto. I due RewriteCond sono connessi con [OR], quindi il primo RewriteCond che restituisce true annullerà un'ulteriore valutazione. Il primo RewriteCond verifica se il file richiesto esiste. Se esiste, restituisce true e l'elaborazione ritorna al primo RewriteRule. L'espressione di destinazione è "-", che significa "non riscrivere". [L] interrompe l'elaborazione delle regole di riscrittura. Quindi, alla fine, per un file esistente abbiamo solo una regex e un test del filesystem, e dopo questo, questo file esistente verrà inviato al browser.
Se non è stato trovato alcun file, il primo RewriteRule e RewriteCond non si attivano, quindi [L] non interromperà il processo. Quindi viene eseguito il secondo RewriteRule. Questo è incondizionato e la regex è la stessa di prima, facendo corrispondere tutto e riscrivendolo a "index.php".
Questa riscrittura non chiamerà index.php se esiste un qualsiasi file, incluso /forum/login.php.
È possibile modificare il secondo a RewriteRule ^.*$ index.php/$0 [L]
se si desidera continuare l'analisi di $_SERVER['PATH_INFO']
anziché $_SERVER['REQUEST_URI']
.
Grazie! Ho cercato questo livello di spiegazione per mesi. – wallyk
Correzione funziona ora. –
Questo è così incredibilmente completo e ha bisogno di più credito di quello che è stato dato. –