2010-05-14 8 views
5

Próbuję uzyskać przewagę nad RewriteCond i chcę przepisać dowolne żądania na statyczną stronę html (jeśli istnieje) lub na określony index.php (o ile żądany plik nie istnieje).Symulowanie 2-poziomowego If-Else przy użyciu RewriteCond

Aby zilustrować logicznych:

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 

nie wydają się mieć wiele kłopotów robi to, kiedy nie trzeba przetestować na HTTP_HOST. Docelowo ten jeden plik .htaccess będzie obsługiwał żądania dla kilku domen.

Wiem, że mógłbym obejść to z vhostami, ale chciałbym wymyślić, jak to zrobić w ten sposób.

Nie jestem zbyt obeznany z niektórymi innymi flagami, czy którekolwiek z nich będzie użyteczne tutaj (jak łańcuch | C, następny | N czy pominięcie | S)?

Z góry dziękuję!


UPDATE: Udało mi się to zrobić, ale chciałbym docenić możliwości:

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] 

Aktualizacja # 2: Z pomocą odpowiedź gumbo, w wymyślił inny. Podoba mi się, że wymagałoby to mniej konserwacji w przypadku dodanych domen. (Dzięki Gumbo!)

Czy są jakieś powody, dla których nie powinienem ustawiać zmiennych ENV?

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] 

Odpowiedz

4

to pewnie zrobić to tak:

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] 

Jest to podobne do zaktualizowanego przykład. Tyle tylko, że pierwsza reguła pominie następujące dwie reguły, jeśli host nie jest odpowiedni. I wzory RewriteRule wykluczają każdą ścieżkę rozpoczynającą się od /default/static/. Ale twoje zasady są już całkiem dobre.

+0

Dzięki! Chociaż wiedziałem o tym, nie znałem składni reguły bez przepisywania. To dało mi pomysł na inne rozwiązanie, które okazało się dokładnie tym, czego chciałem (zaktualizowałem oryginalny wpis). Dzięki jeszcze raz! –