Моделирование 2-уровневого If-Else с использованием RewriteCond

Я пытаюсь разобраться с 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]

person Henrik L.    schedule 14.05.2010    source источник


Ответы (1)


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

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/. Но ваши правила уже довольно хороши.

person Gumbo    schedule 14.05.2010
comment
Спасибо! Хотя я знал об этом, я не знал синтаксиса правила запрета перезаписи. Это дало мне идею для другого решения, которое оказалось именно тем, что я хотел (обновил исходный пост). Спасибо еще раз! - person Henrik L.; 15.05.2010