Reindirizzare le richieste solo se il file non viene trovato?

Spero che ci sia un modo per farlo con mod_rewrite e Apache, ma forse c’è anche un altro modo di considerare.

Sul mio sito, ho creato le directory per le versioni con riverniciatura del sito per i clienti. Se la web root è /home/blah/www , una directory client sarebbe /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 esiste index.html in /home/blah/www/clients/abc e utilizzeranno invece quello in /home/blah/www . Tieni presente che non desidero redirect 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 root. Allo stesso modo, se c’è una richiesta per news.html nella directory del client e lì esiste, quindi serve solo quel file invece del news.html della web root. L’esperienza dell’utente dovrebbe essere perfetta.

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

Nei tuoi esempi, ti preghiamo di indicare se il tuo codice va nel file .htaccess nella directory del client o nella web root. La radice Web è preferita.

 # 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 Riscrivi se i file non esistono

Cosa ne pensi 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] 

Mi sembrava di avere almeno un problema con ciascuno degli esempi sopra. %{DOCUMENT_ROOT} sembrava fare la cosa sbagliata in determinati posti e alcuni / personaggi sembrano mancare. Ecco la mia soluzione, che va nel .htaccess nella web root.

Invece di usare due regole (una per il caso in cui il file sotto i client / è trovato, e uno per non trovato), tutto quello che devo controllare è 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 l’aiuto!

 RewriteCond %{REQUEST_FILENAME} !-f 

Prova questo:

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

Penso che tu voglia qualcosa seguendo queste linee:

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