Apache .htaccess — условное применение базовой аутентификации на основе среды или имени хоста

Мои настройки разработчика: Mac OSX 10.7.4/Apache 2.2.21/PHP 5.3.10

Я хочу добавить условную логику к своим файлам .htaccess в зависимости от среды разработки и живой среды. например, я хочу иметь аутентификацию на реальном сервере, но не на сервере разработки. у меня есть в моем httpd.conf

SetEnv DEV 1

Я подтвердил, что эта переменная установлена, проверив вывод из phpinfo(). затем в моем файле .htaccess

<IfDefine !DEV>
  AuthType Basic
  AuthName "password protected"
  AuthUserFile /path/to/.htpasswd
  Require valid-user
</IfDefine>

... но мне все еще предлагается ввести пароль на моем локальном устройстве. похоже, что переменная DEV недоступна для .htaccess. У меня есть AllowOverride All, установленный в моем httpd.conf для моего корня документа. Любые идеи?


person Devin Emke    schedule 17.06.2012    source источник
comment
Я думаю, что лучший ответ: stackoverflow.com/questions/6143176/   -  person mikevoermans    schedule 02.10.2013


Ответы (6)


Я только что провел около 4 часов в этой проблеме, и я считаю, что у меня есть окончательный ответ, и я могу подвести итог для всех, как решить эту особенно болезненную проблему.

Я использую Windows 7 Home Premium с Apache 2.2x и Php 5.3 в качестве машины для разработки. Я тоже хочу иметь переменную среды DEV, которую я могу использовать в своих файлах .htaccess для отключения перезаписи и других директив, которые недействительны в моей среде разработки, но имеют решающее значение для моей производственной среды.

Мой файл .htaccess выглядит так:

<IfDefine !__DEV__>
    AddType application/x-httpd-php53 .php
</IfDefine>

HostGator сообщил мне, что для того, чтобы иметь php 5.3, мне нужно изменить мой файл htaccess таким образом, чтобы включить его, иначе у меня будет только php 5.2. Но у меня уже есть это на моей машине разработки, поэтому эта директива вызывала сбой моего клиентского веб-сайта, когда я просматривал его локально. Все, что я собираюсь объяснить, позволило мне сохранить ОДИН файл .htaccess в моем репозитории Git, который работает в обоих местах.

Во-первых, позвольте мне прояснить/обобщить все, что я узнал, просматривая Интернет в поисках способа использования IfDefine и SetEnv для решения этой проблемы;

  1. Директива IfDefine в Apache, Only, ONLY, и когда я говорю только, я имею в виду ONLY, отвечает на параметры, переданные в командной строке. Позвольте мне немного подчеркнуть это. ТОЛЬКО КОМАНДНАЯ СТРОКА!
  2. SetEnv и SetEnvIf — две совершенно разные вещи. Один (SetEnv) предназначен для использования в файлах conf, устанавливая переменные среды (специфичные для apache), которые устанавливаются во ВРЕМЯ ЗАПУСКА СЕРВЕРА. SetEnfIf используется во ВРЕМЯ ЗАПРОСА и используется только для определения того, что нужно установить на основе переменных ЗАПРОСА.
  3. Директива IfDefine не считывает переменные, заданные SetEnv или SetEnvIf. Период. Нет аргументов, нет вопросов, нет "но я думал..." НЕТ. Это не так, так что смирись с этим.

Короткий ответ: НЕТ, вы не можете просто использовать «SetEnv DEV 1» в httpd.conf, а затем использовать IfDefine, чтобы обнаружить его в вашем файле .htaccess, что может показаться интуитивно понятным и разумным, исходя из синтаксиса и характера логики программирования. из нас привыкли. Напомним, что на самом деле мы ничего не программируем, что это конфигурационные файлы и, конечно, они не соответствуют этому ожиданию просто потому, что им кажется, что они должны.

Ответ

Так что это означает, что я должен выяснить, как добавить параметр запуска в Apache, что ж, для Linux Guys этот ответ легко доступен, вам просто нужно добавить нужные вещи в файл envvars, а как насчет нас, бедных Windows наркоманов?

Что ж, пользователям Windows это доставляет больше удовольствия по следующим причинам:

  1. Windows не позволяет постоянно добавлять параметры запуска в конфигурацию служб для Apache2.2 (это не работает, не пытайтесь, я делал это миллион раз, поверьте мне). Это правда, если вы зайдете туда и попытаетесь ввести свои собственные параметры, это сработает только один раз, а затем поле параметра будет пустым при следующем открытии диалогового окна. Я не знаю, почему это так, но кажется, что эти параметры предназначены для тестирования, а не для постоянной модификации.
  2. Когда Apache установлен, он создает ярлыки «Пуск», «Остановить» и «Перезапустить» в меню «Пуск», а также устанавливает монитор служб Apache. НО ярлыки в меню «Пуск» используют параметры запуска, отличные от тех, которые используются монитором служб apache. Таким образом, если вы запускаете/останавливаете apache, используя комбинацию этих методов, вы получите разные результаты в зависимости от того, какой метод вы использовали. Однако вы можете поместить -D "__DEV__" в ярлык меню "Пуск", и он будет работать!

Шаги по решению

Чтобы навсегда и универсально настроить переменную среды __DEV__, на которую вы можете ссылаться, используя IfDefine в файлах .htaccess, в среде разработки Windows, которая будет работать независимо от того, запускаете ли вы Apache с помощью службы или ярлыков в меню «Пуск» или с помощью NET START/STOP на командную строку, выполните следующие действия:

  1. Откройте свойства ярлыка меню «Пуск» и извлеките из него команду для запуска Apache. Мой был; "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -w -n "Apache2.2" -k start

  2. Измените его, чтобы включить новую переменную -D __DEV__, которая ДОЛЖНА идти в начале сразу после httpd.exe; "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -D "__DEV__" -w -n "Apache2.2" -k start

  3. Ваш ярлык в меню «Пуск» теперь запустит apache с вашей переменной dev.

  4. Зайти в командную строку (от имени администратора)

  5. Введите: net stop apache2.2 (или любое другое имя вашей службы для apache)

  6. Теперь введите (или скопируйте и вставьте) ту же команду, которая используется в ярлыке меню «Пуск» выше, в командную строку, но внесите в нее следующее изменение; "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -D "__DEV__" -w -n "Apache2.2" -k config

  7. Обратите внимание на изменение слова start на config. Что делает эта волшебная команда, так это сохраняет настройки, которые вы видите на экране, в настройки, хранящиеся в службе в Windows. Нажмите Enter. С этого момента ваша переменная будет передаваться всякий раз, когда вы запускаете службу, Apache Services Monitor запускает службу или Windows запускает службу.

Извините за роман всем, я надеюсь, что это поможет какой-то другой усталой душе, когда вся эта информация будет обобщена и объяснена, я знаю, что это помогло бы мне! :D

person Nerivon    schedule 07.09.2012
comment
Спасибо за советы. Я использую Apache как часть XAMPP в Windows XP (как службу ). Самый простой/единственный способ, который я нашел, это изменить раздел реестра: HKLM\SYSTEM\CurrentControlSet\Services\Apache2.2\ImagePath на "C:\xampp\apache\bin\apache.exe" -DLOCAL -k runservice. LOCAL — это имя параметра в моем случае. - person MrWhite; 15.09.2012
comment
Пожалуйста. Я пробовал XAMPP, это здорово, но он не учит вас многому в управлении Apache, поэтому я всегда устанавливаю все с нуля, насколько это возможно. - person Nerivon; 27.09.2012

Другой вариант моего первого ответа — использовать директиву Allow.

Посмотрите: http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#allow

Order deny,allow
Deny from all
AuthType Basic
AuthName "password protected"
AuthUserFile /path/to/.htpasswd
Require valid-user
Allow from env=DEV
Satisfy Any

Это только проверит, существует ли DEV, а не значение, вот как работает apache. Замените (или добавьте) «Разрешить» на «Разрешить с 127.0.0.1», чтобы ваш локальный хост всегда находился в режиме разработки.

Это говорит о том, что любое из условий приемлемо, где условия: пароль или от 127.0.0.1. Если вы разрабатываете на своем локальном хосте, вы можете использовать 127.0.0.1 или просто заменить его на любой IP-адрес, с которым вы работаете. Его не нужно ни во что оборачивать, просто поместите в файл htaccess. Я использую виртуальные хосты, поэтому я бы разместил его там.

Источник (я изменил его, чтобы он выглядел как исходный код): http://www.askapache.com/htaccess/apache-authentication-in-htaccess.html#allow-conditional

person Michael Ozeryansky    schedule 27.06.2012

Прошло 2 года и у меня такие же проблемы. В частности, мы выполняем автоматическое развертывание в стеке AWS OpsWorks и не можем контролировать размещение файла .htpasswd (используется для сокрытия работы во время разработки).

Наше окончательное рабочее решение было примерно таким (Apache 2.2.25):

# check the host against a regex, defining env=DEV if it matches
# this guy matches localhost, dev.project and 10.1.X.X
SetEnvIfNoCase Host "^(localhost|dev\.project|10\.1(\.\d+){2})$" DEV

AuthType Basic
AuthName "Restricted"

# auth file location, in our case defined by an AWS OpsWorks auto-deployment
# this only gets loaded if the regex above doesn't match, which is handy
AuthUserFile /srv/www/project/current/.htpasswd 

Require valid-user
Satisfy    any
Order      deny,allow
Deny from all
Allow from env=DEV

Это решение достаточно гибкое, чтобы обеспечить доступ к нескольким средам разработки при проверке подлинности любого количества других. Нет необходимости игнорировать или редактировать htaccess перед коммитом git. Переменная окружения может показаться излишней, но она позволяет использовать регулярное выражение и может использоваться в другом месте.

См.: http://httpd.apache.org/docs/2.2/howto/access.html

person som    schedule 01.04.2014
comment
Спасибо, вариант этого (перемещение Требовать действительного пользователя) в конец позволяет мне требовать аутентификацию только для определенного URL-адреса или домена. - person Corey O.; 09.04.2014
comment
Спасибо, я попробовал решение Михаила Озерянского, но оно мне не помогло. Забавно, что вам приходится перемещать директивы. В моей среде (apache 2.2) мне пришлось разрешить либо аутентификацию, либо пользовательский агент. У меня сработал этот вариант: SetEnvIf User-Agent ^MySpecialUserAgent$ noauth=1 AllowOverride Запретить все заказы, разрешить AuthType Basic AuthName Basic Authentication [... AUTH Directives...] Require valid-user Satisfy Any Allow from env=noauth - person devplayer; 02.01.2018

Решение для Debian/Ubuntu:

В /etc/apache2/envars нужно изменить:

## If you would like to pass arguments to the web server, add them below
## to the APACHE_ARGUMENTS environment.
#export APACHE_ARGUMENTS=''

to

## If you would like to pass arguments to the web server, add them below
## to the APACHE_ARGUMENTS environment.
export APACHE_ARGUMENTS='-D __DEV__'

Теперь можно использовать

<IfDefine !__DEV__>
    ...
</IfDefine>
person Stephan Kulla    schedule 25.04.2014

Я люблю отвечать на вопросы, но быстрый поиск в Google дал мне ваш ответ. Ознакомьтесь с документацией по Apache: http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine

Директива IfDefine может проверять только «имя параметра», а «имя параметра» — это переменная, устанавливаемая httpd при запуске.

Также посетите этот сайт и прокрутите вниз до таблицы: http://turboflash.wordpress.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

То, о чем вы просите, все еще возможно, если вы просто запустите свой веб-сервер разработки следующим образом:

$ httpd -DDEV

Это определит переменную DEV. Обратите внимание, что вам не нужно ничего устанавливать, определение в основном означает установку на 1/true. Если он не существует, это похоже на false/0/null/etc...

person Michael Ozeryansky    schedule 27.06.2012

Я решил эту проблему, используя другой подход, основанный на директиве AccessFileName.

В моей среде MAMP я добавил в конфигурацию <VirtualHost> следующее:

AccessFileName .htaccess_dev

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

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

У меня есть это в файле .htaccess:

## production

AuthType Basic
AuthName "Admin"
AuthUserFile /srv/users/prod/apps/appname/public/sys-admin/.htpasswd
require valid-user

И это в .htaccess_dev

## development

AuthType Basic
AuthName "Admin"
AuthUserFile /Users/fregini/Work/MAMP/appname/sys-admin/.htpasswd 
require valid-user
person Fabrizio Regini    schedule 18.04.2019
comment
вау, это лучшее решение без возни с переменными, также с MAMP PRO 6 и apache 2.4 некоторые другие трюки сложнее - person al404IT; 17.11.2020