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.

40
demandé sur Book Of Zeus 2011-08-28 04:00:45

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.

53
répondu Jpsy 2015-04-13 07:31:37

la variable doit être sauvegardée en tant Qu'Apache var, alors elle peut être utilisée sans conditions répétées.

La sauvegarde

dans 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]
29
répondu Huseyin 2013-05-29 00:12:21

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

6
répondu Hoàng Vũ Tgtt 2013-09-01 06:22:24

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 /

4
répondu Viccari 2017-04-13 12:13:44