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

Моя установка dev: Mac OSX 10.7.4/Apache 2.2.21/PHP 5.3.10

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

SetEnv DEV 1

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

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

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

Ответ 1

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

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

Мой .htaccess файл выглядит следующим образом:

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

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

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

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

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

Ответ

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

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

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

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

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

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

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

  • Ярлык вашего стартового меню теперь запускает apache с вашей переменной dev на месте.

  • Перейдите в командную строку (как администратор)

  • Тип: net stop apache2.2 (или любое другое имя вашего сервиса для apache)

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Смотрите: http://httpd.apache.org/docs/2.2/howto/access.html

Ответ 4

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

Ответ 5

Мне нравится отвечать на вопросы, но быстрый поиск в 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/

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

$ httpd -DDEV

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

Ответ 6

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

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

AccessFileName .htaccess_dev

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

Затем я .htpasswd единственный файл .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