Redirecionar solicitações somente se o arquivo não for encontrado?

Eu estou esperando que haja uma maneira de fazer isso com o mod_rewrite e o Apache, mas talvez haja outra maneira de considerar também.

No meu site, tenho diretórios configurados para versões reprojetadas do site para clientes. Se a raiz da web é /home/blah/www , um diretório de cliente seria /home/blah/www/clients/abc . Quando você acessa o diretório do cliente por meio de um navegador da Web, eu quero que ele use todos os arquivos solicitados no diretório do cliente, se existirem. Caso contrário, eu quero usar o arquivo na raiz da web.

Por exemplo, digamos que o cliente não precise de seu próprio index.html . Portanto, algum código determinaria que não há index.html em /home/blah/www/clients/abc e, em vez disso, usaria o em /home/blah/www . Tenha em mente que eu não quero redirect o cliente para a raiz da web a qualquer momento, eu só quero usar o arquivo da raiz da web com esse nome, se o diretório do cliente não tiver especificado sua própria cópia. O navegador da Web ainda deve apontar para /clients/abc se o arquivo existe lá ou na raiz. Da mesma forma, se houver uma solicitação para news.html no diretório do cliente e existir lá, apenas sirva esse arquivo em vez do news.html da raiz da news.html . A experiência do usuário deve ser perfeita.

Eu preciso disso para trabalhar para pedidos em qualquer nome de arquivo. Se eu precisar, por exemplo, adicionar uma nova linha ao .htaccess para cada arquivo que eu queira redirect, ele irá anular a finalidade, pois há muita manutenção necessária e uma boa chance de erros, dado o grande número de arquivos.

Em seus exemplos, indique se seu código está no arquivo .htaccess no diretório do cliente ou na raiz da web. A raiz da Web é preferida.

 # 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 se os arquivos não existem

Que tal agora?

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

Eu parecia ter pelo menos um problema com cada um dos exemplos acima. %{DOCUMENT_ROOT} pareceu fazer a coisa errada em determinados locais e alguns / caracteres parecem estar ausentes. Aqui está a minha solução, que vai no .htaccess na raiz da web.

Em vez de usar duas regras (uma para o caso em que o arquivo sob clientes / é encontrado e um para não ser encontrado), tudo que preciso verificar é se o arquivo solicitado (ou diretório) NÃO existe. Porque se existir, nenhuma mudança é necessária, pode apenas usar o arquivo fornecido no diretório do cliente. Aqui está o código que eu estabeleci:

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

Obrigado pela ajuda!

 RewriteCond %{REQUEST_FILENAME} !-f 

Tente isto:

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

Eu acho que você quer algo ao longo destas linhas:

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