ordre de syntaxe mod_rewrite
mod_rewrite a des règles de classement spécifiques qui affectent le traitement. Avant que quoi que ce soit ne soit fait, la RewriteEngine On
directive doit être donnée car cela active le traitement mod_rewrite. Cela devrait être avant toute autre directive de réécriture.
RewriteCond
ce qui précède RewriteRule
rend cette règle soumise au conditionnel. Toutes les RewriteRules suivantes seront traitées comme si elles n'étaient pas soumises à des conditions.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
Dans ce cas simple, si le référent HTTP provient de serverfault.com, redirigez les demandes de blogs vers des pages spéciales serverfault (nous sommes tout simplement spéciaux). Toutefois, si le bloc ci-dessus comportait une ligne RewriteRule supplémentaire:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg $/blog/$1.sf.jpg
Tous les fichiers .jpg iraient aux pages spéciales serverfault, pas seulement à celles avec un référent indiquant qu'il venait d'ici. Ce n'est clairement pas l'intention de la façon dont ces règles sont écrites. Cela pourrait être fait avec plusieurs règles 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
Mais devrait probablement être fait avec une syntaxe de remplacement plus délicate.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Le plus complexe RewriteRule contient les conditions pour le traitement. La dernière parenthétique (html|jpg)
indique à RewriteRule de correspondre pour html
ou jpg
, et de représenter la chaîne correspondante sous forme de $ 2 dans la chaîne réécrite. Ceci est logiquement identique au bloc précédent, avec deux paires RewriteCond / RewriteRule, il le fait simplement sur deux lignes au lieu de quatre.
Plusieurs lignes RewriteCond sont implicitement AND, et peuvent être explicitement OR. Pour gérer les référents de ServerFault et de super utilisateur (OU explicite):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Pour servir les pages référencées ServerFault avec les navigateurs Chrome (ET implicite):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteBase
est également spécifique à la commande car elle spécifie comment les RewriteRule
directives suivantes gèrent leur traitement. C'est très utile dans les fichiers .htaccess. Si utilisé, il devrait s'agir de la première directive sous "RewriteEngine on" dans un fichier .htaccess. Prenons cet exemple:
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Ceci indique à mod_rewrite que cette URL particulière en cours de traitement a été arrivée via http://example.com/blog/ au lieu du chemin du répertoire physique (/ home / $ Nom d'utilisateur / public_html / blog) et de le traiter en conséquence. Pour cette raison, RewriteRule
il considère que le début de chaîne se situe après le "/ blog" dans l'URL. Voici la même chose écrite de deux manières différentes. Une avec RewriteBase, l'autre sans:
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
Comme vous pouvez le constater, les RewriteBase
règles de réécriture exploitent le chemin d'accès du site Web au contenu plutôt que le serveur Web , ce qui peut les rendre plus intelligibles pour ceux qui modifient de tels fichiers. En outre, ils peuvent raccourcir les directives, ce qui présente un attrait esthétique.
Syntaxe de correspondance RewriteRule
RewriteRule a lui-même une syntaxe complexe pour faire correspondre les chaînes. Je couvrirai les drapeaux (des choses comme [PT]) dans une autre section. Comme les administrateurs système apprennent par l'exemple plus souvent que par la lecture d'une page de manuel, je vais donner des exemples et expliquer ce qu'ils font.
RewriteRule ^/blog/(.*)$ /newblog/$1
La .*
construction correspond à tout caractère unique ( .
) zéro ou plusieurs fois ( *
). Le mettre entre parenthèses lui indique de fournir la chaîne qui correspondait à la variable $ 1.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
Dans ce cas, le premier. * N'était PAS compris entre parenthèses et n'est donc pas fourni à la chaîne réécrite. Cette règle supprime un niveau de répertoire sur le nouveau site de blog. (/blog/2009/sample.html devient /newblog/sample.html).
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$2
Dans ce cas, la première expression entre parenthèses définit un groupe correspondant. Cela devient $ 1, ce qui n'est pas nécessaire et n'est donc pas utilisé dans la chaîne réécrite.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
Dans ce cas, nous utilisons $ 1 dans la chaîne réécrite.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
Cette règle utilise une syntaxe de crochet spéciale qui spécifie une plage de caractères . [0-9] correspond aux chiffres 0 à 9. Cette règle spécifique s’applique aux années 2000 à 2099.
RewriteRule ^/blog/(20[0-9]{2})/(.*)$ /newblog/$1/$2
Cela fait la même chose que la règle précédente, mais la partie {2} lui dit de faire correspondre le caractère précédent (une expression entre crochets dans ce cas) deux fois.
RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html /newblog/$1/$2.shtml
Cette casse correspondra à n'importe quelle lettre minuscule de la deuxième expression correspondante et le fera pour autant de caractères que possible. La \.
construction lui dit de traiter la période comme une période réelle, et non comme le caractère spécial qu'il est dans les exemples précédents. Cela se brisera si le nom du fichier contient des tirets.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
Cela intercepte les noms de fichiers contenant des tirets. Cependant, comme il -
s'agit d'un caractère spécial dans les expressions entre crochets, il doit s'agir du premier caractère de l'expression.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Cette version intercepte tout nom de fichier avec des lettres, des chiffres ou le -
caractère dans le nom du fichier. Voici comment spécifier plusieurs jeux de caractères dans une expression entre crochets.
Drapeaux RewriteRule
Les drapeaux sur les règles de réécriture ont une foule de significations et de cas d'utilisation spéciaux .
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
Le drapeau est [L]
à la fin de l'expression ci-dessus. Plusieurs drapeaux peuvent être utilisés, séparés par une virgule. La documentation liée décrit chacun, mais les voici quand même:
L = dernier. Arrêtez le traitement de RewriteRules une fois que celui-ci correspond. L'ordre compte!
C = chaîne. Continuer le traitement de la prochaine RewriteRule. Si cette règle ne correspond pas, la règle suivante ne sera pas exécutée. Plus sur cela plus tard.
E = Définir la variable environnementale. Apache a diverses variables d'environnement qui peuvent affecter le comportement du serveur Web.
F = Interdit. Retourne une erreur 403-Forbidden si cette règle correspond.
G = parti. Retourne une erreur 410-Gone si cette règle correspond.
H = gestionnaire. Force la demande à être traitée comme s'il s'agissait du type MIME spécifié.
N = Suivant. Force la règle à recommencer et à correspondre à nouveau. FAITES ATTENTION! Des boucles peuvent en résulter.
NC = Aucun cas. Permetjpg
pour correspondre à la fois jpg et JPG.
NE = pas d'échappatoire. Empêche la réécriture des caractères spéciaux (.? # & Etc) en leurs équivalents de code hexadécimal.
NS = Pas de sous-demandes. Si vous utilisez des inclusions côté serveur, cela empêchera les correspondances avec les fichiers inclus.
P = Proxy. Force la règle à être manipulée par mod_proxy. Fournissez le contenu de manière transparente à partir d'autres serveurs, car votre serveur Web le récupère et le restaure. C’est un drapeau dangereux, puisqu’un texte mal écrit transformera votre serveur Web en proxy ouvert et c’est mauvais.
PT = Pass Through. Prendre en compte les instructions Alias dans la correspondance RewriteRule.
QSA = QSAppend. Lorsque la chaîne d'origine contient une requête ( http://example.com/thing?asp=foo) ajoute la chaîne de requête originale à la chaîne réécrite. Normalement, il serait jeté. Important pour le contenu dynamique.
R = redirection. Fournissez une redirection HTTP vers l'URL spécifiée. Peut également fournir le code de redirection exact [R = 303]. Très semblable à RedirectMatch
, ce qui est plus rapide et devrait être utilisé lorsque cela est possible.
S = Passer. Passer cette règle.
T = Type. Spécifiez le type mime du contenu renvoyé. Très semblable à la AddType
directive.
Vous savez comment j'ai dit que cela RewriteCond
s'applique à une et une seule règle? Eh bien, vous pouvez contourner cela en chaînant.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html [C]
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Comme la première règle RewriteRule a l'indicateur Chain, la deuxième règle rewrite s'exécutera lorsque la première le sera, ce qui correspond à la correspondance de la règle précédente RewriteCond. Très pratique si les expressions régulières Apache vous font mal au cerveau. Cependant, la méthode tout-en-un-ligne que je pointe dans la première section est plus rapide du point de vue de l'optimisation.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Ceci peut être simplifié grâce aux drapeaux:
RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html /newblog/$1/$2.shtml [NC]
De plus, certains drapeaux s’appliquent également à RewriteCond. Notamment, NoCase.
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [NC]
Correspondra à "ServerFault.com"