2009-02-27 13 views
14

Spero che ci sia un modo per farlo con mod_rewrite e Apache, ma forse c'è anche un altro modo di considerare.Reindirizza le richieste solo se il file non viene trovato?

Sul mio sito, ho impostato le directory per le versioni con riscrittura del sito per i clienti. Se la web root è /home/blah/www, una directory del client sarà /home/blah/www/clients/abc. Quando si accede alla directory del client tramite un browser Web, si desidera che utilizzi tutti i file richiesti nella directory del client, se presenti. Altrimenti, voglio che usi il file nella web root.

Ad esempio, supponiamo che il client non abbia bisogno del proprio index.html. Pertanto, alcuni codici determinerebbero che non è disponibile lo index.html in /home/blah/www/clients/abc e verrà utilizzato quello in /home/blah/www. Tieni presente che non desidero reindirizzare il client alla radice Web in qualsiasi momento, ma voglio solo utilizzare il file root web con quel nome se la directory del client non ha specificato la propria copia. Il browser Web dovrebbe comunque puntare a /clients/abc se il file esiste lì o nella radice. Allo stesso modo, se c'è una richiesta per nella directory del client e lo esiste, quindi serve solo quel file invece del numero di web root news.html. L'esperienza dell'utente dovrebbe essere perfetta.

Ho bisogno che funzioni per richieste su qualsiasi nome file. Se devo, per esempio, aggiungere una nuova riga a .htaccess per ogni file che potrei voler reindirizzare, piuttosto sconfigge lo scopo dato che c'è troppa manutenzione necessaria e una buona possibilità di errori dato il gran numero di file.

Nei vostri esempi, si prega di indicare se il proprio codice va nel file .htaccess nella directory del client o nella web root. La radice Web è preferita.

risposta

4

mi sembrava di avere almeno un problema con ciascuno degli esempi a Bove. %{DOCUMENT_ROOT} sembrava fare la cosa sbagliata in determinati luoghi e alcuni caratteri / sembrano mancare. Ecco la mia soluzione, che va nella .htaccess nella web root.

Invece di utilizzare due regole (una per il caso in cui il file sotto i client/è stato trovato e uno per non trovato), tutto ciò che devo verificare è se il file richiesto (o la directory) NON esiste. Perché se esiste, non è necessaria alcuna modifica, può semplicemente utilizzare il file fornito nella directory del client. Ecco il codice su cui mi sono stabilito:

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

Grazie per il vostro aiuto!

3
RewriteCond %{REQUEST_FILENAME} !-f 
+1

Sembra troppo corto per fare ciò che voglio. Puoi spiegare un po 'la logica? Grazie! – 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] 

Da Rewrite if files do not exist

0

Prova questo:

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

È inteso per .htaccess nella radice Web? – DivideByHero

+0

Sì, è inteso per il file .htaccess nella directory radice del documento. – Gumbo

0

Penso che si desidera qualcosa in queste righe:

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

Buon punto. Ma in .file htaccess il pattern non deve iniziare con una barra. E sarebbe più comodo se si utilizza la variabile DOCUMENT_ROOT. – Gumbo

+0

Puoi chiarire come dovrebbe essere aggiornato con DOCUMENT_ROOT? Non funziona così com'è. – DivideByHero

+0

Sostituisci in RewriteCond "/ home/blah/www /" di "% {DOCUMENT_ROOT}" e rimuovilo nelle sostituzioni. Rimuovere anche il "/" iniziale nei modelli di espressione regolare. Quindi dovrebbe funzionare. – Gumbo

9

Che ne dici di questo?

# 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] 
Problemi correlati