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

Моя установка dev: 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 для моего корня документа. Есть идеи?

5 ответов

У меня осталось около 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), которые установлены в SERVER START TIME. SetEnfIf используется в ВРЕМЯ ЗАПРОСА и используется только для определения того, что установить на основе переменных REQUEST.
  3. Директива IfDefine не читает переменные, установленные с помощью SetEnv или SetEnvIf. Период. Там нет аргументов, нет вопросов, нет "но я думал..." НЕТ. Это не так, чтобы преодолеть это.

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

Ответ

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

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

  1. Windows не позволяет вам постоянно добавлять параметры запуска в конфигурацию служб для Apache2.2 (это не работает, не пробуйте, я делал это миллион раз, поверьте мне). Это верно, если вы зайдете туда и попытаетесь ввести свои собственные параметры, это будет работать только один раз, и тогда поле параметров будет пустым при следующем открытии диалога. Я не знаю, почему это так, но кажется, что эти параметры предназначены для тестирования, а не для постоянной модификации.
  2. Когда Apache установлен, он создает ярлыки "Пуск", "Стоп" и "Перезапуск" в меню "Пуск", а также устанавливает монитор Apache Services. НО ярлыки в меню "Пуск" используют параметры запуска, отличные от тех, которые используются мониторами служб 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

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

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

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

Прошло 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 commit. Переменная окружения может показаться излишней, но она допускает регулярное выражение и может использоваться в другом месте.

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

Решение для 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=''

в

## 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>

Я решил эту проблему, используя другой подход, основанный на 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

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

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...

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