htaccess условия

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

В моем файле httpd.conf у меня есть:

SetEnv APP_ENV "development"

В моем файле .htaccess у меня есть:

AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /dev/null
require valid-user

Мне было интересно, можно ли каким-либо образом поставить условие вокруг материала htppasswd, чтобы, когда APP_ENV было development, у меня не запрашивался пароль.

Возможно ли это?


person Lizard    schedule 26.07.2010    source источник


Ответы (5)


Если у вас есть такая возможность, подумайте об обновлении до Apache 2.4 (или последней бета-версии 2.3, начиная с 2.4 еще не совсем выпущен).

Одной из новых доступных функций являются контейнеры авторизации, которые значительно упрощают определение требований к доступу. с помощью директивы Require.

У вас должно получиться что-то вроде:

AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /path/to/file/groups

SetEnv APP_ENV "development"

<RequireAll>
  <RequireAny>
    <RequireAll>
      #main requirements
      Require group user
      #other conditions if needed for non-dev/non-local
    </RequireAll>

    <RequireAll>
      #allow direct if development
      Require env APP_ENV development
    </RequireAll>

    <RequireAll>
      <RequireAny>
        #allow loopback and local network
        Require ip 127.0.0.1
        Require ip 10.2
      </RequireAny>
    </RequireAll>
  <RequireAny>

  #other conditions if needed for everyone

  <RequireNone>
    #blacklist
  </RequireNone>
</RequireAll>
person HorusKol    schedule 12.01.2012

Один из способов создания условных блоков с переменными env — использование модуля mod_macro. Ранее я сделал пример здесь.

В этом конкретном случае у вас будет поверх файла VirtualHost (до определения VirtualHost):

<Macro ConditionalBlockMacroSecurity_production>
    AuthName "Restricted Area"
    AuthType Basic
    AuthUserFile /path/to/file/.htpasswd
    AuthGroupFile /dev/null
    require valid-user
</Macro>
<Macro ConditionalBlockMacroSecurity_development >
    <IfModule mod_headers.c>
       Header set MyHeader "Hello this is DEVELOPMENT envirronment. It took %D microseconds for Apache to serve this request."
    </IfModule>
</Macro>

И внутри виртуального хоста:

Use ConditionalBlockMacroSecurity_${APP_ENV}

где путь к файлу htpassword также может быть задан как параметр макроса.

Недостатком этого решения является то, что вам нужно установить mod_macro на рабочий сервер, это не обычно устанавливаемый модуль, и для этого вам потребуется некоторый контроль над рабочей средой. С другой стороны, простое решение состоит в том, чтобы иметь несколько версий ваших виртуальных хостов в зависимости от среды и добавить некоторые комментарии в раздел Auth. Но если вы ищете общее решение, это, безусловно, означает, что это повторяющаяся проблема, и вы хотите избежать ручного редактирования файлов, в таких случаях mod_macro может стать очень профессиональным способом извлечь выгоду из вашего опыта с Apache, пока ваши конфигурации Apache не станут одним макросом. с параметрами, вызывая множество других макросов.

person regilero    schedule 11.01.2012

Условные обозначения в конфигурации Apache работают только один раз, когда конфигурация [пере]загружается.

Я бы создал второй VirtualHost с тем же корневым каталогом и контролировал доступ, используя Deny/Allow на основе IP-адреса.

person m1tk4    schedule 26.07.2010

Добавьте следующее:

Require valid-user
Allow from <dev IP>
Satisfy Any

Для этого необходимо применить Require valid-user или Allow from <dev IP>.

person zrvan    schedule 10.01.2012
comment
Это сработает, но я должен использовать Satisfy All из-за других ограничений. - person gpojd; 11.01.2012
comment
@gpojd, не могли бы вы опубликовать всю свою настройку? - person zrvan; 11.01.2012
comment
К сожалению, я не могу его опубликовать. Мой .htaccess похож на OP, но я также ограничиваю IP-адрес и имею Satisfy All. - person gpojd; 11.01.2012

В файле .htaccess вы можете вкладывать блоки в директиву IfDefine, например:

<IfDefine PROD>
  bla bla bla
</IfDefine>

Затем обязательно передайте -D PROD в качестве аргумента при запуске apache. Этот раздел будет работать только в том случае, если определен PROD. В Ubuntu вы можете сделать это, например, отредактировав /etc/apache2/envvars и добавив эту строку в конце:

export APACHE_ARGUMENTS="-D PROD"

Вы можете «инвертировать» его, возможно, используя что-то вроде <IfDefine !DEV> для запуска только тогда, когда это не среда разработки, а затем передать -D DEV в этой среде и оставить рабочие сайты как есть без необходимости редактировать envvars.

Измените в соответствии с вашими потребностями!

person Mattias Ahnberg    schedule 12.01.2012