wake-up-neo.com

Mehrere RewriteRules für eine RewriteCond in .htaccess

Ich habe folgenden Befehl in meinem .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 funktioniert nicht in der zweiten und späteren Zeile. Kann ich eine Variable für% 2 definieren und in allen RewriteRule-Befehlen verwenden? Der folgende Befehl funktioniert

     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]

Ich möchte jedoch% 2 für mehrere Regelzeilen verwenden, ohne die Bedingung zu duplizieren.

44
Huseyin

Die Variable muss als Apache-Var gespeichert werden, damit sie ohne wiederholte Bedingungen verwendet werden kann.

Das Speichern in Apache-Variablen wird in der zweiten Zeile angezeigt. Verwendung gespeicherter Vars in der 3. und 4. Zeile.

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

Sie können das RewriteRule-Flag S|skip Verwenden, um mehrere RewriteRules an eine einzelne RewriteCond (oder an einen Satz von RewriteConds) zu binden. Hier ist ein Beispiel, das ein Kond auf drei Regeln anwendet:

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

Um eine vorhandene Bedingung so zu ändern, dass sie für mehrere Regeln funktioniert, müssen Sie:

  • Annulliere die Bedingung (stelle sie voran!)
  • Wenn Sie mehrere RewriteConds haben:
    Ändern Sie logische ANDs in den Conds in ORs und umgekehrt.
  • Fügen Sie vor allen Regeln, die Sie an die Bedingung (en) binden möchten, eine Umschreibungsregel für das Überspringen hinzu. Stellen Sie den S-Parameter auf die Anzahl der zu überspringenden Regelzeilen ein.

Bitte beachten Sie, dass in den übersprungenen Regeln keine Rückverweise verwendet werden können, die auf die RewriteCond (wie% 1) verweisen. Auf diese kann nur in der überspringenden RewriteRule zugegriffen werden.

58
Jpsy

Das macht natürlich nicht viel Spaß, vor allem, wenn die Dinge wachsen und komplexer werden. Es gibt jedoch eine weniger bekannte Option der RewriteRule-Anweisung, die Apache anweist, die nächste N-Nummer der RewriteRule-Anweisung zu überspringen. [S = N]. Anstatt jedes Mal zu überprüfen, ob die Anforderung KEINE Datei UND KEIN Verzeichnis ist, können Sie Folgendes tun: Codeblock

#
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]

#

Ich fand dies, von: http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/

Ich finde es hilfreich

7
Hoàng Vũ Tgtt

Ab Apache 2.4 können Sie das <If> Richtlinie:

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