2010-05-14 5 views
5

Estoy tratando de entender RewriteCond, y quiero reescribir cualquier solicitud en una página html estática (si existe), o en un index.php específico (siempre que el archivo solicitado no exista).Simulando un If-Else de 2 niveles usando RewriteCond

Para ilustrar la lógica:

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 

no parece tener mucha dificultad para hacerlo cuando no necesito para probar la HTTP_HOST. En última instancia, este archivo .htaccess gestionará solicitudes para varios dominios.

Sé que podría evitar esto con fantasmas, pero me gustaría descubrir cómo hacerlo de esta manera.

No estoy muy familiarizado con algunas de las otras banderas, ¿alguna de ellas será útil aquí (como chain | C, next | N o skip | S)?

¡Gracias de antemano!


ACTUALIZACIÓN: Me las he arreglado para hacerlo, pero agradecería alternativas:

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] 

ACTUALIZACIÓN # 2: Con la ayuda de la respuesta de Gumbo, se le ocurrió otra. Me gusta que esto requeriría menos mantenimiento en el caso de dominios agregados. (Gracias Gumbo!)

¿Hay alguna razón por la que no deba establecer las variables 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] 

Respuesta

4

probablemente lo haría así:

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] 

Esto es similar al ejemplo actualizado. Excepto que la primera regla omitirá las dos reglas siguientes si el host no es apropiado. Y los patrones RewriteRule excluyen cualquier ruta que comience con /default/static/. Pero tus reglas ya son bastante buenas.

+0

Gracias! Mientras estaba al tanto, no sabía la sintaxis de la regla de no reescritura. Esto me dio la idea de otra solución que resulta ser exactamente lo que quería (actualicé la publicación original). ¡Gracias de nuevo! –

Cuestiones relacionadas