Как я могу использовать SetEnvIf, чтобы установить переменную, основанную на Http Host?

11

Я пытаюсь установить переменную на Apache

ENV = DEV, если http-хост - это URL-адрес разработчика

или

ENV = PRD, если http-хост - это URL-адрес prd

а затем используйте $ _SERVER ['ENV'], чтобы создать несколько логических ветвей

До сих пор ни один из них не работал для меня, и у нас установлен модуль setenvif

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Какой правильный способ сделать это?

qodeninja
источник

Ответы:

15

Кратко рассмотрим документацию :

Директива SetEnvIf определяет переменные среды на основе атрибутов запроса. Атрибут, указанный в первом аргументе, может быть одним из трех:

Поле заголовка HTTP-запроса (для получения дополнительной информации см. RFC2616); например: Host, User-Agent, Referer и Accept-Language. Регулярное выражение может использоваться для указания набора заголовков запроса.

Так что, безусловно, можно сделать переменную окружения условной для Hostзаголовка. Похоже, вы пытаетесь использовать либо заголовки, Refererлибо Remote_Host, ни один из которых не является именно тем, что вы хотите (хотя в теории в большинстве случаев Refererдолжно содержать значение Hostзаголовка). Remote_Hostбудет именем хоста клиента, делающего запрос, что совсем не то, что вам нужно (и в большинстве конфигураций просто не будет доступно, так как обычно поиск DNS отключен по соображениям производительности).

Попробуйте что-то вроде этого:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

... а затем используйте $ _SERVER ['ENV'], чтобы создать несколько логических ветвей

Но учтите также, что вы можете просто ссылаться на значение Hostзаголовка напрямую в PHP, не проходя через эту чиканье; $_SERVER['HTTP_HOST']будет иметь именно то, что вы хотите.

larsks
источник
Прекрасный. Это позволило мне написать пользовательские правила, требующие пароли при подключении к определенным хостам, но не к другим (т. Е. Защищать промежуточный ящик, когда одна виртуальная машина клонируется на несколько экземпляров Amazon EC2, но не писать собственные рецепты Chef). Очень полезный, если трудно найти, функционал.
Эрик Л.
1
В SetEnvIfдокументах говорится, что третий параметр является регулярным выражением. Разве точки в доменном имени не должны быть экранированы обратной косой чертой? Или кавычка в двойных кавычках заставляет Apache рассматривать его как строковый литерал?
jakub.g
@ jakub.g Да, они являются регулярным выражением, и их следует избегать. В этом случае, поскольку точка соответствует любому отдельному символу, "www-dev.example.com"регулярное выражение также будет соответствовать неожиданным именам хостов, таким как www-dev-example.com. Вы получите ожидаемые совпадения и многое другое. Я обновил пример сейчас.
Мартин