Перенаправлять запросы только если файл не найден? - PullRequest
15 голосов
/ 27 февраля 2009

Я надеюсь, что есть способ сделать это с 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 в каталоге клиента или в корневой веб-каталог. Веб-корень является предпочтительным.

Ответы [ 6 ]

25 голосов
/ 27 февраля 2009
# 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] 

С Переписать, если файлы не существуют

10 голосов
/ 04 сентября 2012

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

# 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]
5 голосов
/ 03 марта 2009

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

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

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

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

3 голосов
/ 27 февраля 2009
RewriteCond %{REQUEST_FILENAME} !-f
0 голосов
/ 27 февраля 2009

Я думаю, вы хотите что-то вроде этого:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}clients/$1/$2 -f
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}clients/$1/$2 [L]
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}$2 [L]
0 голосов
/ 27 февраля 2009

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

RewriteEngine on
RewriteRule ^clients/abc/ - [L]
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f
RewriteRule .* clients/abc/$0 [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...