2010-05-14 6 views
5

J'essaie de comprendre RewriteCond et de réécrire toutes les requêtes soit sur une page html statique (si elle existe), soit sur un index.php spécifique (tant que le fichier demandé n'existe pas).Simulation d'un If-Else à 2 niveaux en utilisant RewriteCond

Pour illustrer la logique:

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 

Je ne semble pas avoir beaucoup de mal à faire quand je ne ai pas besoin de tester la HTTP_HOST. En fin de compte, ce fichier .htaccess traitera des demandes pour plusieurs domaines. Je sais que je pourrais contourner cela avec vhosts, mais je voudrais savoir comment le faire de cette façon.

Je ne connais pas très bien les autres drapeaux, y en aura-t-il qui seront utiles ici (comme chain | C, next | N ou skip | S)?

Merci d'avance!


MISE À JOUR: J'ai réussi à le faire, mais apprécierait des alternatives:

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] 

MISE À JOUR # 2: Avec l'aide de la réponse de Gumbo, est venu avec une autre. J'aime que cela nécessiterait moins de maintenance dans le cas de domaines ajoutés. (Merci Gumbo!)

Y at-il des raisons pour lesquelles je ne devrais pas définir les 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] 

Répondre

4

je ne serais probablement pas le faire comme ceci:

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] 

Ceci est similaire à votre exemple mis à jour. Sauf que la première règle ignorera les deux règles suivantes si l'hôte n'est pas approprié. Et les modèles RewriteRule excluent tout chemin commençant par /default/static/. Mais vos règles sont déjà plutôt bonnes.

+0

Merci! Alors que j'en étais conscient, je ne connaissais pas la syntaxe de la règle de non-réécriture. Cela m'a donné l'idée d'une autre solution qui s'avère être exactement ce que je voulais (mis à jour le message original). Merci encore! –

Questions connexes