web-dev-qa-db-fra.com

RewriteRules multiples pour un seul RewriteCond dans .htaccess

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.

44
Huseyin

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]
31
Huseyin

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:

  • Annulez la condition (ajoutez-la avec!)
  • Si vous avez plusieurs RewriteConds:
    Remplacez les ET logiques des Cond par des OU et vice versa.
  • Ajoutez une règle de réécriture ignorée devant toutes les règles que vous souhaitez lier aux conditions. Définissez le paramètre S sur le nombre de lignes de règle à ignorer.

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.

58
Jpsy

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

7
Hoàng Vũ Tgtt

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>

http://httpd.Apache.org/docs/2.4/expr.html#examples

3
Juan Calero