Per capire di quale mod_rewrite devi prima capire come funziona un web server. Un server Web risponde alle richieste HTTP . Una richiesta HTTP al suo livello più elementare è simile alla seguente:
GET /foo/bar.html HTTP/1.1
Questa è la semplice richiesta di un browser a un server Web che richiede l' URL /foo/bar.html
da esso. È importante sottolineare che non richiede un file , ma richiede solo un URL arbitrario. La richiesta potrebbe anche apparire così:
GET /foo/bar?baz=42 HTTP/1.1
Questa è una richiesta altrettanto valida per un URL e ovviamente non ha più nulla a che fare con i file.
Il web server è un'applicazione in ascolto su una porta, che accetta richieste HTTP in arrivo su quella porta e restituisce una risposta. Un web server è completamente libero di rispondere a qualsiasi richiesta in qualsiasi modo ritenga opportuno / in qualsiasi modo sia stato configurato per rispondere. Questa risposta non è un file, è una risposta HTTP che può o meno avere a che fare con file fisici su qualsiasi disco. Un web server non deve essere Apache, ci sono molti altri web server che sono tutti solo programmi che funzionano in modo persistente e sono collegati a una porta che risponde alle richieste HTTP. Puoi scriverne uno tu stesso. Questo paragrafo intendeva separarti da qualsiasi idea che gli URL uguagliano direttamente i file, il che è davvero importante da capire. :)
La configurazione predefinita della maggior parte dei server Web è cercare un file che corrisponda all'URL sul disco rigido. Se la radice del documento del server è impostata su, diciamo, /var/www
potrebbe sembrare se il file /var/www/foo/bar.html
esiste e servirlo in tal caso. Se il file termina con ".php" invocherà l'interprete PHP e quindi restituirà il risultato. Tutta questa associazione è completamente configurabile; un file non deve terminare in ".php" affinché il server Web lo esegua tramite l'interprete PHP e l'URL non deve corrispondere a un determinato file sul disco perché accada qualcosa.
mod_rewrite è un modo per riscrivere la gestione delle richieste interne. Quando il server Web riceve una richiesta per l'URL /foo/bar
, è possibile riscrivere tale URL in qualcos'altro prima che il server Web cercherà un file sul disco corrispondente. Esempio semplice:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Questa regola dice ogni volta che una richiesta corrisponde a "/ foo / bar", riscrivila in "/ foo / baz". La richiesta verrà quindi gestita come se /foo/baz
fosse stata invece richiesta. Questo può essere usato per vari effetti, ad esempio:
RewriteRule (.*) $1.html
Questa regola corrisponde a qualunque cosa ( .*
) e la cattura ( (..)
), quindi la riscrive per aggiungere ".html". In altre parole, se /foo/bar
era l'URL richiesto, verrà gestito come se /foo/bar.html
fosse stato richiesto. Vedere http://regular-expressions.info per ulteriori informazioni sulla corrispondenza, l'acquisizione e le sostituzioni di espressioni regolari.
Un'altra regola spesso riscontrata è questa:
RewriteRule (.*) index.php?url=$1
Questo, ancora una volta, corrisponde a qualsiasi cosa e lo riscrive nel file index.php con l'URL originariamente richiesto aggiunto nel url
parametro query. Cioè, per tutte le richieste in arrivo, il file index.php viene eseguito e questo file avrà accesso alla richiesta originale in $_GET['url']
, quindi può fare tutto ciò che vuole con esso.
In primo luogo, inserisci queste regole di riscrittura nel file di configurazione del tuo server web . Apache consente inoltre * di inserirli in un file chiamato .htaccess
all'interno della radice del documento (ovvero accanto ai file .php).
* Se consentito dal file di configurazione principale di Apache; è facoltativo, ma spesso abilitato.
Ciò che mod_rewrite fa non lo fanno
mod_rewrite non rende magicamente tutti i tuoi URL "belli". Questo è un malinteso comune. Se hai questo link nel tuo sito web:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
non c'è niente che mod_rewrite possa fare per renderlo carino. Per rendere questo un bel link, devi:
Cambia il link in un link carino:
<a href="https://stackoverflow.com/my/pretty/link">
Utilizzare mod_rewrite sul server per gestire la richiesta all'URL /my/pretty/link
utilizzando uno dei metodi sopra descritti.
(Si potrebbe usare mod_substitute
congiuntamente per trasformare le pagine HTML in uscita e i loro collegamenti contenuti. Anche se questo è generalmente uno sforzo maggiore rispetto al semplice aggiornamento delle risorse HTML.)
Mod_rewrite può fare molto e regole di abbinamento molto complesse che puoi creare, tra cui concatenare diverse riscritture, inviare richieste a un servizio o macchina completamente diverso, restituire codici di stato HTTP specifici come risposte, reindirizzare richieste ecc. È molto potente e può essere utilizzato per ottimo se si capisce il meccanismo fondamentale di richiesta-risposta HTTP. Essa non rende automaticamente i vostri collegamenti abbastanza.
Vedi la documentazione ufficiale per tutte le possibili bandiere e opzioni.