Запросы перенаправления, только если файл не найден?
Я надеюсь, что есть способ сделать это с помощью mod_rewrite и Apache, но, возможно, есть и другой способ рассмотрения.
На моем сайте у меня есть каталоги, настроенные для перенастроенных версий сайта для клиентов. Если корнем веб-сервера является /home/blah/www
, каталог клиента будет /home/blah/www/clients/abc
. Когда вы обращаетесь к каталогу клиента через веб-браузер, я хочу, чтобы он использовал любые запрошенные файлы в каталоге клиента, если они существуют. В противном случае я хочу, чтобы он использовал файл в корневом каталоге.
Например, скажем, клиенту не нужен собственный index.html
. Поэтому некоторый код определит, что в /home/blah/www/clients/abc
нет index.html
, и вместо этого он будет использоваться в /home/blah/www
. Имейте в виду, что я не хочу перенаправлять клиента в корневой каталог в любое время, я просто хочу использовать корневой файл в Интернете с этим именем, если каталог клиента не указал свою собственную копию. Веб-браузер должен указывать на /clients/abc
, существует ли файл там или в корне. Аналогично, если в каталоге клиента есть запрос news.html
, и он существует там, просто выполните этот файл вместо веб-корня news.html
. Пользовательский интерфейс должен быть бесшовным.
Мне нужно, чтобы это работало для запросов на любое имя файла. Если мне нужно, например, добавить новую строку в .htaccess
для каждого файла, который я могу перенаправить, он скорее побеждает цель, так как требуется слишком много необходимого обслуживания и хорошая вероятность ошибок, учитывая большое количество файлов.
В ваших примерах укажите, идет ли ваш код в файле .htaccess в каталоге клиента или в корневом каталоге веб-сайта. Предпочтительным является веб-корень.
Ответы
Ответ 1
Кажется, у меня, по крайней мере, одна проблема с каждым из приведенных выше примеров. %{DOCUMENT_ROOT}
, казалось, делал неправильную вещь в определенных местах, и некоторые символы /
, кажется, отсутствовали. Вот мое решение, которое входит в .htaccess
в корневой каталог.
Вместо использования двух правил (один для случая, когда файл под клиентами/найден, и один для не найден), все, что мне нужно проверить, это если запрошенный файл (или каталог) НЕ существует. Поскольку, если он существует, изменений не требуется, он может просто использовать файл, указанный в каталоге клиента. Вот код, на котором я остановился:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-f
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-d
RewriteRule ^clients/([^/]+)/(.*)$ $2 [L]
Спасибо за вашу помощь!
Ответ 2
# 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]
Из Переписать, если файлы не существуют
Ответ 3
Как насчет этого?
# 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]
Ответ 4
RewriteCond %{REQUEST_FILENAME} !-f
Ответ 5
Попробуйте следующее:
RewriteEngine on
RewriteRule ^clients/abc/ - [L]
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f
RewriteRule .* clients/abc/$0 [L]
Ответ 6
Я думаю, вам нужно что-то в этом роде:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}clients/$1/$2 -f
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}clients/$1/$2 [L]
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}$2 [L]