условные выражения htaccess
-
29-09-2020 - |
Вопрос
Я настроил аутентификацию 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
что мне не запрашивают пароль.
Это возможно?
Решение
Если у вас есть такая возможность, вам следует подумать об обновлении до Апач 2.4 (или последняя бета-версия 2.3, поскольку версия 2.4 еще не выпущена).
Одна из новых доступных функций: Контейнеры авторизации - значительно упрощает определение требований к доступу с помощью Требовать директива.
В итоге у вас должно получиться что-то вроде:
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>
Другие советы
Один из способов создания условных блоков if с переменными 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>
И внутри Virtualhost:
Use ConditionalBlockMacroSecurity_${APP_ENV}
где путь к файлу htpassword также может быть установлен как параметр макроса.
Недостатком этого решения является то, что вам необходимо установить mod_macro на производственный сервер, это не часто устанавливаемый модуль, и для этого вам понадобится некоторый контроль над рабочей средой.С другой стороны, простое решение — иметь несколько версий ваших виртуальных хостов в зависимости от среды и добавить несколько комментариев в раздел Auth.Но если вы ищете общее решение, это, безусловно, означает, что это повторяющаяся проблема, и вы хотите избежать ручного редактирования файлов. В таких случаях mod_macro может стать очень профессиональным способом использования вашего опыта работы с Apache, пока ваши конфигурации Apache не станут одним макросом. с параметрами, вызывая множество других макросов.
Условные выражения в конфигурации Apache работают только один раз, когда конфигурация [пере]загружается.
Я бы создал второй VirtualHost с тем же корневым каталогом и управлял доступом с помощью Deny/Allow на основе IP-адреса.
Добавьте следующее:
Require valid-user
Allow from <dev IP>
Satisfy Any
Это потребует, чтобы Require valid-user
или Allow from <dev IP>
применяется.
В вашей .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.
Измените соответствующим образом в соответствии с вашими потребностями!