Имитация двухуровневого If-Else с использованием RewriteCond - PullRequest
5 голосов
/ 14 мая 2010

Я пытаюсь разобраться с RewriteCond и хочу переписать любые запросы либо на статическую HTML-страницу (если она существует), либо на конкретный index.php (до тех пор, пока запрошенный файл не существует) ).

Для иллюстрации логики:

if HTTP_HOST is '(www\.)?mydomain.com'
    if file exists: "/default/static/{REQUEST_URI}.html", then
        rewrite .* to /default/static/{REQUEST_URI}.html
    else if file exists: {REQUEST_FILENAME}, then
        do not rewrite
    else
        rewrite .* to /default/index.php

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

Я знаю, что смогу обойти это с помощью vhosts, но я бы хотел выяснить, как это сделать таким образом.

Я не слишком знаком с некоторыми другими флагами, пригодятся ли здесь какие-либо из них (например, chain | C, next | N или skip | S)?

Заранее спасибо!


ОБНОВЛЕНИЕ: мне удалось это сделать, но я был бы признателен за альтернативы:

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..* [NC]
RewriteCond %{DOCUMENT_ROOT}/%1/static/%{REQUEST_URI}.html -f
RewriteRule (.*)? /%1/static/$1.html [NC,L]

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..* [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /%1/index.php [L,QSA]

ОБНОВЛЕНИЕ № 2: С помощью ответа Гамбо, придумал другой. Мне нравится, что это потребует меньшего количества обслуживания в случае добавления доменов. (Спасибо, Гамбо!)

Есть ли причины, по которым я не должен устанавливать переменные ENV?

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..*$ [NC]
RewriteRule ^ - [E=APP:%1]

RewriteCond %{DOCUMENT_ROOT}/%{ENV:APP}/static/%{REQUEST_URI}.html -f       
RewriteRule (.*)? /%{ENV:APP}/static/$1.html [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /%{ENV:APP}/index.php [L,QSA]

1 Ответ

5 голосов
/ 14 мая 2010

Я бы, наверное, сделал это так:

RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$
RewriteRule ^ - [S=2]

RewriteCond %{DOCUMENT_ROOT}/default/static%{REQUEST_URI}.html -f
RewriteRule !^default/static/ default/static%{REQUEST_URI}.html [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^default/static/ default/index.php [L]

Это похоже на ваш обновленный пример. За исключением того, что первое правило пропустит следующие два правила, если хост не подходит. А шаблоны RewriteRule исключают любой путь, начинающийся с /default/static/. Но ваши правила уже довольно хороши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...