2010-05-14 9 views
5

Ich versuche, RewriteCond um den Kopf zu bekommen, und möchte alle Anfragen entweder auf eine statische HTML-Seite (falls vorhanden) oder auf eine bestimmte index.php (solange die angeforderte Datei nicht existiert).Simulation eines 2-Level-If-Else mit RewriteCond

die Logik Zur Veranschaulichung:

if HTTP_HOST is '(www\.)?mydomain.com' 
    if file exists: "/default/static/{REQUEST_URI}.html", then 
     rewrite .* to /default/static/{REQUEST_URI}.html 
    else if file exists: {REQUEST_FILENAME}, then 
     do not rewrite 
    else 
     rewrite .* to /default/index.php 

ich scheinen nicht viel Mühe zu haben, es zu tun, wenn ich für die HTTP_HOST müssen nicht testen. Letztendlich wird diese .htaccess-Datei Anfragen für mehrere Domains bearbeiten.

Ich weiß, ich könnte das mit Vhosts umgehen, aber ich würde gerne herausfinden, wie es so geht.

Ich kenne mich mit einigen der anderen Flags nicht aus, wird einer von ihnen hier nützlich sein (wie Kette | C, nächste | N oder überspringen | S)?

Vielen Dank im Voraus!


UPDATE: Ich habe es geschafft, es zu tun, würde aber Alternativen zu schätzen wissen:

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..* [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1/static/%{REQUEST_URI}.html -f 
RewriteRule (.*)? /%1/static/$1.html [NC,L] 

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..* [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* /%1/index.php [L,QSA] 

UPDATE # 2: Mit Hilfe von Gumbo Antwort, mit einem anderen kam. Ich mag, dass dies im Fall von zusätzlichen Domänen weniger Wartung erfordern würde. (Danke Gumbo!)

Gibt es irgendwelche Gründe, warum ich ENV-Variablen nicht setzen sollte?

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..*$ [NC] 
RewriteRule^- [E=APP:%1] 

RewriteCond %{DOCUMENT_ROOT}/%{ENV:APP}/static/%{REQUEST_URI}.html -f  
RewriteRule (.*)? /%{ENV:APP}/static/$1.html [NC,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* /%{ENV:APP}/index.php [L,QSA] 

Antwort

4

würde ich wahrscheinlich tun es wie folgt aus:

RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ 
RewriteRule^- [S=2] 

RewriteCond %{DOCUMENT_ROOT}/default/static%{REQUEST_URI}.html -f 
RewriteRule !^default/static/ default/static%{REQUEST_URI}.html [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^default/static/ default/index.php [L] 

Dies zu Ihrer aktualisierten Beispiel ähnlich ist. Abgesehen davon, dass die erste Regel die folgenden zwei Regeln überspringt, wenn der Host nicht geeignet ist. Und die RewriteRule Muster schließen jeden Pfad aus, der mit /default/static/ beginnt. Aber deine Regeln sind schon ziemlich gut.

+0

Danke! Solange ich mir dessen bewusst war, kannte ich die Syntax der No-Rewrite-Regel nicht. Dies gab mir die Idee für eine andere Lösung, die genau das ist, was ich wollte (aktualisiert den ursprünglichen Beitrag). Danke noch einmal! –