Plusieurs règles de réécriture pour une seule réécriture.htaccess
j'ai le commandement suivant dans mon .htaccess
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).example.com [NC]
RewriteRule ^(.*?)-([a-z]+) %2/. [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/. [L]
%2 ne fonctionne pas sur la deuxième ligne et les lignes suivantes. Puis-je définir une variable pour %2 et l'utiliser dans toutes les commandes RewriteRule? La commande suivante fonctionne
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).example.com [NC]
RewriteRule ^(.*?)-([a-z]+) %2/. [L]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).example.com [NC]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/. [L]
mais je veux utiliser %2 pour la ligne de règle multiple sans condition de duplication.
4 réponses
vous pouvez utiliser le drapeau RewriteRule S|skip
pour lier plusieurs RewriteRules à une seule RewriteCond (ou à un ensemble de RewriteConds). Voici un exemple qui applique une condition à trois règles:
RewriteCond %{HTTP_HOST} !^www.mydomain.com$
# skip rules if NOT within domain - only way to tie multiple rules to one cond
RewriteRule .? - [S=3]
RewriteRule ^path1(/.*)$ /otherpath1
RewriteRule ^path2(/.*)$ /otherpath2
RewriteRule ^path3(/.*)$ /otherpath3
pour changer un Cond existant pour travailler pour plusieurs règles, vous devez:
- annulez la condition (préparez-la avec !)
- si vous avez plusieurs Réwriteconds:
Change logical Et dans les condoms vers ORs et vice versa. - ajouter une règle de réécriture sauteuse devant toutes les règles que vous voulez lier à la(AUX) condition (s). Définissez le paramètre S au nombre de lignes de règle à sauter.
s'il vous plaît être conscient qu'il n'est pas possible d'utiliser des références arrières qui renvoient à la Seconde réécriture (comme %1) dans les règles sautées. Ceux-ci ne sont accessibles que dans le skipping RewriteRule.
la variable doit être sauvegardée en tant Qu'Apache var, alors elle peut être utilisée sans conditions répétées.
La sauvegardedans les variables Apache s'affiche à la deuxième ligne. Utilisation des vars sauvegardés dans les lignes 3 et 4.
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
RewriteRule .? - [E=Wa:%1,E=Wb:%2]
RewriteRule ^(.*?)-([a-z]+) %{ENV:Wb}/.%{ENV:Wb} [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %{ENV:Wb}/. [L]
clairement, ce n'est pas très amusant, surtout que les choses grandissent et deviennent plus complexes. Cependant, il existe une option moins connue de la déclaration RewriteRule, qui dit à apache de sauter le nombre N suivant de la déclaration RewriteRule. [S=N]. Donc au lieu de vérifier à chaque fois si la requête N'est pas un fichier et N'est pas un répertoire, nous pourrions faire ceci: Bloc de Code
#
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [S=3]
RewriteRule ^([^./]+)/$ http://www.santweb.co.uk/ [L]
RewriteRule ^([^./]+)/([^./]+)/$ http://www.santweb.co.uk// [L]
RewriteRule ^([^./]+)/([^./]+)/([^./]+)/$ http://www.santweb.co.uk/// [L]
#
j'ai trouvé ceci, de: http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess /
je pense que c'serviable
en général, vous ne pouvez pas utiliser plusieurs instructions RewriteRule après une seule Réwritecond. Mais vous pouvez faire un petit truc à vos conditions si vous voulez, comme vu à:
https://serverfault.com/questions/162586/one-rewritecond-for-multiple-rewriterules
ou
http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess /