J'ai la commande suivante dans mon .htaccess
RewriteCond %{HTTP_Host} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]
% 2 ne fonctionne pas sur les deuxième et dernière lignes. 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/$1.$2 [L]
RewriteCond %{HTTP_Host} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]
Mais je veux utiliser% 2 pour plusieurs lignes de règle sans condition de duplication.
La variable doit être enregistrée en tant que var Apache, puis peut être utilisée sans conditions répétées.
L'enregistrement dans les variables Apache est affiché en deuxième ligne. Utilisation des variables enregistrées en 3ème et 4ème lignes.
RewriteCond %{HTTP_Host} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
RewriteRule .? - [E=Wa:%1,E=Wb:%2]
RewriteRule ^(.*?)-([a-z]+) %{ENV:Wb}/$1.%{ENV:Wb} [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %{ENV:Wb}/$1$3.$2 [L]
Vous pouvez utiliser l'indicateur RewriteRule S|skip
pour lier plusieurs RewriteRules à un seul RewriteCond (ou à un ensemble de RewriteConds). Voici un exemple qui applique un Cond à 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$1
RewriteRule ^path2(/.*)$ /otherpath2$1
RewriteRule ^path3(/.*)$ /otherpath3$1
Pour modifier un Cond existant pour qu'il fonctionne avec plusieurs règles, vous devez:
Veuillez noter qu'il n'est pas possible d'utiliser des références arrières qui pointent vers le RewriteCond (comme% 1) dans les règles ignorées. Celles-ci ne sont accessibles que dans la RewriteRule ignorée.
De toute évidence, ce n'est pas très amusant, d'autant plus que les choses grandissent et deviennent plus complexes. Cependant, il existe une option moins connue de l'instruction RewriteRule, qui indique à Apache d'ignorer le numéro N suivant de l'instruction 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/$1 [L]
RewriteRule ^([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2 [L]
RewriteRule ^([^./]+)/([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2/$3 [L]
#
J'ai trouvé cela, à partir de: http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/
Je pense que c'est utile
Depuis Apache 2.4, vous pouvez utiliser le <If>
directive:
RewriteEngine On
<If "%{HTTP:Upgrade} == 'websocket'">
RewriteRule /nidoran/(.*) ws://localhost:8080/nidoran/$1 [P,L]
RewriteRule /kakuna/(.*) ws://localhost:8081/kakuna/$1 [P,L]
RewriteRule /porygon/(.*) ws://localhost:8082/porygon/$1 [P,L]
</If>