ordine di sintassi mod_rewrite
mod_rewrite ha alcune regole di ordinamento specifiche che influenzano l'elaborazione. Prima di fare qualsiasi cosa, la RewriteEngine On
direttiva deve essere data in quanto ciò attiva l'elaborazione mod_rewrite. Questo dovrebbe essere prima di qualsiasi altra direttiva di riscrittura.
RewriteCond
precedente RewriteRule
rende quella UNA soggetta al condizionale. Le seguenti RewriteRules verranno elaborate come se non fossero soggette a condizioni.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
In questo semplice caso, se il referrer HTTP proviene da serverfault.com, reindirizza le richieste del blog a pagine speciali serverfault (siamo proprio così speciali). Tuttavia, se il blocco sopra aveva una riga RewriteRule aggiuntiva:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg $/blog/$1.sf.jpg
Tutti i file .jpg andrebbero alle pagine speciali di serverfault, non solo quelle con un referrer che indica che provengono da qui. Questo chiaramente non è l'intento di come sono scritte queste regole. Potrebbe essere fatto con più regole RewriteCond:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Ma probabilmente dovrebbe essere fatto con qualche sintassi di sostituzione più complicata.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Il RewriteRule più complesso contiene i condizionali per l'elaborazione. L'ultimo tra parentesi (html|jpg)
indica a RewriteRule di corrispondere per uno html
o jpg
, e di rappresentare la stringa corrispondente come $ 2 nella stringa riscritta. Questo è logicamente identico al blocco precedente, con due coppie RewriteCond / RewriteRule, lo fa solo su due righe anziché su quattro.
Più righe RewriteCond sono implicitamente ANDed e possono essere esplicitamente ORed. Per gestire i referrer da ServerFault e Super User (OR esplicito):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Per servire le pagine riferite a ServerFault con i browser Chrome (AND implicito):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteBase
è anche un ordine specifico in quanto specifica come le seguenti RewriteRule
direttive gestiscono la loro elaborazione. È molto utile nei file .htaccess. Se utilizzato, dovrebbe essere la prima direttiva in "RewriteEngine on" in un file .htaccess. Prendi questo esempio:
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Questo sta dicendo a mod_rewrite che questo particolare URL che sta attualmente gestendo è arrivato tramite http://example.com/blog/ invece del percorso della directory fisica (/ home / $ Username / public_html / blog) e di trattarlo di conseguenza. Per questo motivo, RewriteRule
considera che l'inizio della stringa sia dopo il "/ blog" nell'URL. Ecco la stessa cosa scritta in due modi diversi. Uno con RewriteBase, l'altro senza:
RewriteEngine On
##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg) $1.sf.$2
##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Come puoi vedere, RewriteBase
consente di riscrivere le regole per sfruttare il percorso del contenuto del sito Web piuttosto che il server Web , il che può renderle più comprensibili a coloro che modificano tali file. Inoltre, possono ridurre le direttive, il che ha un fascino estetico.
Sintassi di corrispondenza RewriteRule
RewriteRule stesso ha una sintassi complessa per la corrispondenza delle stringhe. Tratterò le bandiere (cose come [PT]) in un'altra sezione. Poiché i amministratori di sistema imparano con l'esempio più spesso che leggendo una pagina man , darò degli esempi e spiegherò cosa fanno.
RewriteRule ^/blog/(.*)$ /newblog/$1
Il .*
costrutto corrisponde a qualsiasi carattere singolo ( .
) zero o più volte ( *
). Racchiudendolo tra parentesi si dice che fornisce la stringa che è stata abbinata come variabile $ 1.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
In questo caso, il primo. * NON era racchiuso tra parentesi quindi non viene fornito alla stringa riscritta. Questa regola rimuove un livello di directory dal nuovo sito blog. (/blog/2009/sample.html diventa /newblog/sample.html).
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$2
In questo caso, la prima espressione tra parentesi imposta un gruppo corrispondente. Questo diventa $ 1, che non è necessario e quindi non utilizzato nella stringa riscritta.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
In questo caso, usiamo $ 1 nella stringa riscritta.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
Questa regola utilizza una sintassi di parentesi speciale che specifica un intervallo di caratteri . [0-9] corrisponde ai numeri da 0 a 9. Questa regola specifica gestirà gli anni dal 2000 al 2099.
RewriteRule ^/blog/(20[0-9]{2})/(.*)$ /newblog/$1/$2
Questo fa la stessa cosa della regola precedente, ma la parte {2} gli dice di far corrispondere il carattere precedente (un'espressione di parentesi in questo caso) due volte.
RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html /newblog/$1/$2.shtml
Questo caso corrisponderà a qualsiasi lettera minuscola nella seconda espressione corrispondente e lo farà per il maggior numero possibile di caratteri. Il \.
costrutto gli dice di trattare il periodo come un periodo reale, non il carattere speciale che è negli esempi precedenti. Tuttavia, si interromperà se il nome del file contiene trattini.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
Questo intrappola i nomi dei file con trattini. Tuttavia, poiché -
è un carattere speciale nelle espressioni tra parentesi, deve essere il primo carattere nell'espressione.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Questa versione intrappola qualsiasi nome di file con lettere, numeri o il -
carattere nel nome del file. Ecco come specificare più set di caratteri in un'espressione di parentesi.
RewriteRule flags
I flag sulle regole di riscrittura hanno una miriade di significati speciali e casi d'uso .
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
La bandiera è [L]
alla fine dell'espressione precedente. È possibile utilizzare più flag, separati da una virgola. La documentazione collegata descrive ciascuno di essi, ma eccoli comunque:
L = ultimo. Interrompere l'elaborazione di RewriteRules quando questa corrisponde. L'ordine conta!
C = Catena. Continua l'elaborazione del prossimo RewriteRule. Se questa regola non corrisponde, la regola successiva non verrà eseguita. Più su questo più tardi.
E = Imposta variabile ambientale. Apache ha varie variabili ambientali che possono influenzare il comportamento del web server.
F = proibito. Restituisce un errore 403-proibito se questa regola corrisponde.
G = Andato. Restituisce un errore 410 andato se questa regola corrisponde.
H = Gestore. Forza la richiesta a essere gestita come se fosse il tipo MIME specificato.
N = Avanti. Forza la regola a ricominciare da capo e ad abbinare nuovamente. STAI ATTENTO! Possono verificarsi dei loop.
NC = Nessun caso. permettejpg
per abbinare sia jpg che JPG.
NE = Nessuna via di fuga. Impedisce la riscrittura di caratteri speciali (.? # & Etc) nei loro equivalenti in codice esadecimale.
NS = Nessuna richiesta secondaria. Se utilizzi le inclusioni lato server, ciò impedirà la corrispondenza con i file inclusi.
P = Proxy. Forza la regola ad essere gestita da mod_proxy. Fornisci in modo trasparente contenuto da altri server, perché il tuo server web lo recupera e lo serve nuovamente. Questa è una bandiera pericolosa, poiché una scritta male trasformerà il tuo server web in un proxy aperto e quello è male.
PT = Pass Through. Prendi in considerazione le dichiarazioni Alias nella corrispondenza RewriteRule.
QSA = QSAppend. Quando la stringa originale contiene una query ( http://example.com/thing?asp=foo) aggiunge la stringa di query originale alla stringa riscritta. Normalmente sarebbe scartato. Importante per i contenuti dinamici.
R = Reindirizzamento. Fornire un reindirizzamento HTTP all'URL specificato. Può anche fornire il codice di reindirizzamento esatto [R = 303]. Molto simile a RedirectMatch
, che è più veloce e dovrebbe essere usato quando possibile.
S = Salta. Salta questa regola.
T = Tipo. Specificare il tipo mime del contenuto restituito. Molto simile alla AddType
direttiva.
Sai come ho detto che si RewriteCond
applica a una e una sola regola? Bene, puoi aggirare questo incatenando.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html [C]
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Poiché la prima RewriteRule ha il flag Chain, la seconda regola di riscrittura verrà eseguita quando la prima lo fa, ovvero quando viene abbinata la precedente regola RewriteCond. Comodo se le espressioni regolari di Apache fanno male al cervello. Tuttavia, il metodo all-in-one-line che indico nella prima sezione è più veloce dal punto di vista dell'ottimizzazione.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Questo può essere reso più semplice attraverso i flag:
RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html /newblog/$1/$2.shtml [NC]
Inoltre, alcuni flag si applicano anche a RewriteCond. In particolare, NoCase.
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [NC]
Corrisponderà a "ServerFault.com"