Перенаправить запросы только если файл не найден?
Я надеюсь, что есть способ сделать это с помощью 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)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, 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]