Установите переменные среды в .htaccess на основе TLD

Я пытаюсь установить переменные среды в своем файле .htaccess на основе домена верхнего уровня сервера. Но после совпадения условия файл .htaccess дальше не выполняется.

Если нет соответствующего домена, _rooturl_ устанавливается, а _rootfolder_ нет. Однако, когда домен совпадает, _rootfolder_ устанавливается, а _rooturl_ нет. Это также относится к любым другим перенаправлениям, определенным после этого.

(...)

<If "req('Host') =~ /domain.com/ || req('Host') =~ /localhost/">
    RewriteRule .* - [E=_rootfolder_:www.domain.com]
</If>

<If "req('Host') =~ /domain.de/">
    RewriteRule .* - [E=_rootfolder_:www.domain.de]
</If>

RewriteRule .* - [E=_rooturl_:domainname]

(...)

TL; DR, я хочу, чтобы мой код выполнялся после прохождения условий IF.

Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
4
0
513
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать этот блок правил, полностью основанный на mod_rewrite правилах:

RewriteEngine On

RewriteCond %{HTTP_HOST} (localhost|domain\.com) [NC]
RewriteRule ^ - [E=_rootfolder_:www.domain.com]

RewriteCond %{HTTP_HOST} domain\.de [NC]
RewriteRule ^ - [E=_rootfolder_:www.domain.de]

RewriteRule ^ - [E=_rooturl_:domainname]

Вы также можете сделать это с помощью mod_setenvif:

SetEnvIf Host "(localhost|domain\.com)" _rootfolder_=www.domain.com
SetEnvIf Host "domain\.de" _rootfolder_=www.domain.de
SetEnvIf Host ^ _rooturl_=domainname

Но после совпадения условия файл .htaccess дальше не выполняется.

Хотя этого не должно происходить с директивами, которые вы опубликовали. Он должен «работать» по назначению. Но это может зависеть от того, какие другие директивы у вас есть, которые зависят от этих env vars. И в какой-то степени именно то, какие выражения и директивы вы используете.

Здесь есть несколько потенциальных проблем:

  • <If> контейнеры меняют порядок обработки. Содержимое блоков <If> обычно объединяется очень поздно, однако директивы mod_rewrite по-прежнему обрабатываются перед директивами mod_rewrite в том же контексте, независимо от того, где контейнеры <If> появляются в порядке директив.

  • Если вы не включите наследование mod_rewrite (например, RewriteOptions Inherit), директивы mod_rewrite в более поздних <If> блоках полностью переопределяют директивы mod_rewrite в более ранних <If> блоках. (Точно так же директивы mod_rewrite в файле подкаталога .htaccess полностью переопределяют директивы mod_rewrite в родительском файле .htaccess.) Это нормально, если выражения <If> являются взаимоисключающими или вы ожидаете, что более поздние директивы переопределяют (а не добавляют) более ранние директивы.

Другие вопросы по теме