Як я можу використовувати SetEnvIf для встановлення змінної на основі хот Http?


11

Я намагаюся встановити змінну на Apache

ENV = DEV, якщо http-хостом є URL-адреса розробника

або

ENV = PRD, якщо http-хостом є URL-адреса prd

а потім використовуйте $ _SERVER ['ENV'] для створення деяких логічних гілок

Поки жоден з них не працював на мене, і у нас встановлений модуль setenvif

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Який правильний спосіб зробити це?

Відповіді:


15

Швидкий огляд документації :

Директива SetEnvIf визначає змінні середовища на основі атрибутів запиту. Атрибут, зазначений у першому аргументі, може бути одним із трьох речей:

Поле заголовка HTTP-запиту (для отримання додаткової інформації див. RFC2616); наприклад: Хост, Користувач-агент, Референт та Мова прийняття. Для визначення набору заголовків запитів може використовуватися регулярний вираз.

Отже, звичайно можна зробити змінну середовища умовною для 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']матиме саме те, що ви хочете.


Гарний. Це дозволить мені написати власні правила, щоб вимагати паролі під час підключення до певних Хостів, але не до інших (тобто захищати поле для встановлення, коли один VM клонований на декілька екземплярів Amazon EC2, але не пишіть власні рецепти шеф-кухарів). Дуже корисна, якщо важко шукати, функціональність.
Ерік Л.

1
У SetEnvIfдокументах говорять про те , що треті пари є регулярним виразом, що не точок в імені домена слід маскувати за допомогою зворотного косих рис? Або цитування значення в подвійних лапках змушує Apache трактувати його як рядковий буквал?
jakub.g

@ jakub.g Так, вони є регулярним виразом і слід уникати цього. У цьому випадку, оскільки точка відповідає будь-якому одному символу, "www-dev.example.com"регулярний вираз також буде відповідати несподіваним іменам хостів, наприклад www-dev-example.com. Ви отримаєте очікувані матчі та багато іншого. Я зараз оновив приклад.
Martijn Heemels
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.