2009-02-27 5 views
14

J'espère qu'il y a un moyen de le faire avec mod_rewrite et Apache, mais peut-être y a-t-il une autre façon de le faire aussi.Redirige les demandes uniquement si le fichier est introuvable?

Sur mon site, j'ai des répertoires mis en place pour les versions re-skinned du site pour les clients. Si la racine Web est /home/blah/www, un répertoire client est /home/blah/www/clients/abc. Lorsque vous accédez au répertoire client via un navigateur Web, je souhaite qu'il utilise les fichiers demandés dans le répertoire client s'ils existent. Sinon, je veux qu'il utilise le fichier dans la racine web. Par exemple, disons que le client n'a pas besoin de son propre index.html. Par conséquent, du code déterminerait qu'il n'y a pas index.html dans /home/blah/www/clients/abc et utilisera à la place celui de /home/blah/www. Gardez à l'esprit que je ne veux pas rediriger le client vers la racine web à tout moment, je veux juste utiliser le fichier racine du web avec ce nom si le répertoire client n'a pas spécifié sa propre copie. Le navigateur Web doit toujours pointer vers /clients/abc si le fichier existe à cet endroit ou à la racine. De même, s'il y a une demande de news.html dans le répertoire du client et que existe existe, il suffit de servir ce fichier au lieu du news.html de la racine Web. L'expérience de l'utilisateur devrait être transparente.

J'ai besoin que cela fonctionne pour les demandes sur n'importe quel nom de fichier. Si je dois, par exemple, ajouter une nouvelle ligne à .htaccess pour chaque fichier que je souhaite rediriger, cela va à l'encontre du but car il y a trop de maintenance nécessaire, et il y a de bonnes chances d'erreurs étant donné le grand nombre de fichiers.

Dans vos exemples, veuillez indiquer si votre code va dans le fichier .htaccess dans le répertoire client ou dans la racine web. La racine Web est préférée.

Répondre

4

me semblait avoir au moins un problème avec chacun des exemples un bove. %{DOCUMENT_ROOT} semblait faire la mauvaise chose à certains endroits, et certains caractères / semblent être manquant. Voici ma solution, qui va dans le .htaccess dans la racine du Web. Au lieu d'utiliser deux règles (une pour le cas où le fichier sous clients/est trouvé, et un pour non trouvé), tout ce que j'ai besoin de vérifier est si le fichier (ou répertoire) demandé n'existe pas. Parce que s'il existe, aucune modification n'est nécessaire, il peut simplement utiliser le fichier fourni dans le répertoire client. Voici le code que j'ai choisi:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-f 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-d 
RewriteRule ^clients/([^/]+)/(.*)$ $2 [L] 

Merci pour votre aide!

3
RewriteCond %{REQUEST_FILENAME} !-f 
+1

Cela semble trop court pour faire ce que je veux. Pouvez-vous expliquer la logique un peu? Merci! – DivideByHero

23
# If requested resource exists as a file or directory, skip next two rules 
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/$1 -d 
RewriteRule (.*) - [S=2] 
# 
# Requested resource does not exist, do rewrite if it exists in /archive 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d 
RewriteRule (.*) /archive/$1 [L] 
# 
# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 

De Rewrite if files do not exist

0

Essayez ceci:

RewriteEngine on 
RewriteRule ^clients/abc/ - [L] 
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f 
RewriteRule .* clients/abc/$0 [L] 
+0

Est-ce que cela est destiné à .htaccess dans la racine web? – DivideByHero

+0

Oui, il est destiné au fichier .htaccess dans le répertoire racine du document. – Gumbo

0

Je pense que vous voulez quelque chose le long de ces lignes:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}clients/$1/$2 -f 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}clients/$1/$2 [L] 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}$2 [L] 
+0

Bon point. Mais en .Fichiers htaccess Le motif ne doit pas commencer par une barre oblique. Et ce serait plus pratique si vous utilisiez la variable DOCUMENT_ROOT. – Gumbo

+0

Pouvez-vous préciser comment cela devrait être mis à jour avec DOCUMENT_ROOT? Cela ne fonctionne pas tel quel. – DivideByHero

+0

Remplacez RewriteCond "/ home/blah/www /" par "% {DOCUMENT_ROOT}" et supprimez-le dans les substitutions. Supprimez également le "/" principal dans les modèles d'expression régulière. Alors ça devrait marcher. – Gumbo

9

Que pensez-vous de cela?

# If requested resource exists as a file or directory go to it 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule (.*) - [L] 

# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 
Questions connexes