15

Ich arbeite an einem virtuellen Domain-System. Ich habe ein Wildcard-DNS als *.loc eingerichtet, und ich versuche, an meiner .htaccess Datei zu arbeiten. Der folgende Code funktioniert:.% N Rückreferenz innerhalb RewriteCond

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^(www.)?example\.loc$ [NC] 
RewriteCond %{REQUEST_URI} !^/example/ 
RewriteRule (.*) /example/$1 [L,QSA] 

Aber ich dies mit etwas arbeiten, möchte ich in setzen Allerdings muss ich die %{REQUEST_URI} gegen den Text geprüft, wie der Domäne gefunden. Ich habe versucht, mit diesem Code:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^(www.)?([a-zA-Z0-9-]*.)?([a-zA-Z0-9-]+)\.loc$ [NC] 
RewriteCond %{REQUEST_URI} !^/%3/ 
RewriteRule (.*) /%3/$1 [L,QSA] 

Aber die Linie RewriteCond %{REQUEST_URI} !^/%3/ meinen Code verursacht einen Internal Server Error durch. Ich verstehe, dass dies wegen der% N in meinem Code ist, aber gibt es eine Möglichkeit, damit ich arbeiten kann? Ich brauche diese Zeile, sonst schlägt mein Code bei internen Weiterleitungen fehl.

Ich hoffe, dass dies für jemanden Sinn macht. Alles, was ich brauche, ist, einen RewriteCond in einem folgenden RewriteCond zurückreferenzieren zu können.

Antwort

38

Es gibt 2 Dinge, die Sie hier falsch machen.

Zunächst ist Ihre %{HTTP_HOST} Regex nicht gut. Sie müssen den . Punkten entkommen, sonst werden sie als "jedes Zeichen, das kein Zeilenumbruch ist" behandelt. Dies macht im Wesentlichen die Rückreferenz %3 das letzte Zeichen des Hostnamens vor der TLD (z. B. http://blah.bar.loc, % 3 = r).

Zweitens können Sie keine Rückverweise in der Regex von RewriteCond, nur die linke Seite Zeichenfolge, es ist eine Art seltsame Einschränkung. Sie können jedoch die \1 Referenzen in der Regex verwenden, so dass Sie eine clevere Linke-Seite-Zeichenkette konstruieren können. Etwas wie %3::%{REQUEST_URI} und dann können Sie wie folgt übereinstimmen: !^(.*?)::/\1/?. Diese Regex sagt im Wesentlichen: „Spiel und Gruppe den ersten Textblock vor die ::, dann sicher, dass der Textblock machen nach den :: beginnt mit /(first block)“.

So sollten Ihre Regeln wie folgt aussehen:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^(www\.)?([a-zA-Z0-9-]*\.)?([a-zA-Z0-9-]+)\.loc$ [NC] 
RewriteCond %3::%{REQUEST_URI} !^(.*?)::/\1/? 
RewriteRule (.*) /%3/$1 [L,QSA] 
+0

Prost! Ich habe keine Ahnung, was zum Teufel diese Linie wirklich macht, aber es funktioniert. Für jetzt bin ich glücklich damit. Ihre Hilfe wird sehr geschätzt :) –

+1

Wo in aller Welt ist dies dokumentiert. Diese Antwort verdient so viele weitere Stimmen. Ich stimme zu, dass wir die Antwort nicht akzeptieren, Kopfgeld geben und wieder akzeptieren. –

+0

Sehr schlau! Danke =) – gobwas

Verwandte Themen