Условно включите конфигурацию Apache - PullRequest
0 голосов
/ 20 февраля 2019

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

RewriteCond %{HTTP_HOST} !^www\.example\.com$
## skip next 1000 rules, if we`re not on the .com domain.
RewriteRule .? - [S=1000]
RewriteRule ^foo https://www.example.com/bar [R=301,L]
...
RewriteCond %{HTTP_HOST} !^www\.example\.co\.uk$
## skip next 500 rules, if we`re not on the .co.uk domain. 
RewriteRule .? - [S=500]
RewriteRule ^foo https://www.example.co.uk/bar [R=301,L]
...

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

Можно ли использовать в выражении директиву включения вместо

"RewriteRule .? - [S=500]"

?

Может быть что-то вроде этого:

<If "%{HTTP_HOST} =~ ^www\.example\.com$">
    Include conf/com.rewriterules.conf
</If>

Или есть еще лучшие способычтобы решить это?

1 Ответ

0 голосов
/ 22 февраля 2019

мы не можем изменить настройки сервера и, таким образом, единственный способ сохранить правила перезаписи - это htaccess.

Вы не можете сделать это в .htaccess, так как вы не можетеиспользуйте директиву Include в файлах .htaccess.Нет другого способа включения файла конфигурации.И единственный способ включить это условно - с помощью блока <If>.

Вы можете потенциально иметь все директивы внутри блока <If> вместо использования флага [S=1000].Однако это не без серьезных предостережений.Пока выражение <If> обрабатывается рано, содержимое блока <If> объединяется позднее («последний») в запросе.Фактически, он, кажется, объединен очень поздно после того, как запрос уже был сопоставлен с файловой системой.Это означает, что директивы RewriteRule соответствуют пути разрешенной файловой системы, а не запрошенному URL-пути!Таким образом, это необходимо учитывать в любых директивах RewriteRule или перейти на использование mod_alias Redirect или RedirectMatch для внешних перенаправлений, которые всегда действуют на запрошенный URL.

Вы можете потенциально сделать это в конфигурации сервера (используйте директиву Include внутри блока <If>).Но применяется то же самое предостережение, как упомянуто выше - блок <If> объединен очень поздно .

Обратите внимание, однако, ваш синтаксис не совсем корректен.Если вы хотите сопоставить регулярное выражение, то у вас отсутствуют косые черты вокруг регулярного выражения.Он должен выглядеть следующим образом:

<If "%{HTTP_HOST} =~ /^www\.example\.com$/">
    Include conf/com.rewriterules.conf
</If>

Или использовать более простое сравнение строк / равенств:

<If "%{HTTP_HOST} == 'www.example.com'">
:

Однако вместо использования блока <If> предпочтительнее иметь отдельный<VirtualHost> для каждого домена и в каждом vHost вы можете просто Include нужный файл.Никаких предостережений.


Ничего особенного, но ... если все ваши "правила перезаписи" являются внешними перенаправлениями (как в вашем примере) для запросов, которые в противном случае привели бы к 404 (т. Е. Онине существует), тогда вам не следует делать все эти перенаправления в конфигурации Apache для начала (.htaccess или конфигурации сервера).

Они должны быть в логике вашего приложения и обрабатываться только "поздно"когда ваше приложение определило, что в противном случае это приведет к 404. Это расставит приоритеты по нормальному трафику сайта, а не по приоритетам перенаправлений.С перенаправлениями в конфигурации Apache они обрабатываются при каждом отдельном запросе - это часто не нужно.


RewriteRule ^foo https://www.example.com/bar [R=301,L]
:
RewriteRule ^foo https://www.example.co.uk/bar [R=301,L]

Может быть, просто ваш пример кода, но вам не нужноуказать абсолютный URL-адрес в подстановке RewriteRule для внешних перенаправлений.это может быть root-относительно: /bar.

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