Перенаправить запросы только если файл не найден?

Я надеюсь, что есть способ сделать это с помощью mod_rewrite и Apache, но, возможно, есть и другой способ.

На моем сайте у меня есть каталоги, созданные для обновленных версий сайта для клиентов. Если веб-корень есть /home/blah/www, каталог клиента будет /home/blah/www/clients/abc . Когда вы получаете доступ к каталогу клиента через веб-браузер, я хочу, чтобы он использовал любые запрошенные файлы в каталоге клиента, если они существуют. В противном случае я хочу, чтобы он использовал файл в корневом веб-каталоге.

Например, предположим, что клиенту не нужны свои собственные index.html . Следовательно, некоторый код определит, что нет index.html in, /home/blah/www/clients/abc и вместо этого будет использовать тот, который находится в /home/blah/www . Имейте в виду, что я не хочу перенаправлять клиента в корневой веб-каталог в любое время, я просто хочу использовать файл корневого веб-сайта с этим именем, если в каталоге клиента не указана его собственная копия. Веб-браузер по-прежнему должен указывать /clients/abc, существует ли файл там или в корне. Точно так же, если есть запрос news.html в каталоге клиента и действительно существует там, то просто служить файл вместо веб - Рута news.html . Пользовательский опыт должен быть безупречным.

Мне нужно, чтобы это работало для запросов к любому имени файла. Если мне нужно, например, добавить новую строку .htaccess для каждого файла, который я мог бы перенаправить, это скорее противоречит цели, поскольку требуется слишком много обслуживания и есть хороший шанс для ошибок, учитывая большое количество файлов.

В своих примерах укажите, находится ли ваш код в файле .htaccess в каталоге клиента или в корневом веб-каталоге. Веб-корень предпочтительнее.

Ответов (6)

Решение

Кажется, у меня была по крайней мере одна проблема с каждым из приведенных выше примеров. %{DOCUMENT_ROOT} казалось, что в определенных местах он делал что-то не так, а некоторые / персонажи, кажется, отсутствуют. Вот мое решение, которое находится .htaccess в корневом веб-каталоге.

Вместо использования двух правил (одно для случая, когда файл под клиентами / найден, а другое - для не найденного), все, что мне нужно проверить, - это НЕ существует ли запрошенный файл (или каталог). Поскольку, если он существует, никаких изменений не требуется, он может просто использовать файл, предоставленный в каталоге клиента. Вот код, на котором я остановился:

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

Спасибо за вашу помощь!

Как насчет этого?

# 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]
RewriteCond %{REQUEST_FILENAME} !-f

Попробуй это:

RewriteEngine on
RewriteRule ^clients/abc/ - [L]
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f
RewriteRule .* clients/abc/$0 [L]
# 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] 

Из перезаписи, если файлы не существуют

Я думаю, вам нужно что-то в этом роде:

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