#.htaccess #apache2.4
Вопрос:
Я пытаюсь разместить защиту на двух страницах. Однако, когда я нажимаю «Отмена», отображаются эти страницы. Я использую WordPress, это настройка в моем .htaccess
файле.
SetEnvIf Request_URI "^/page/page1/$" PAGE1
# use BASIC authentication only when env variable PAGE1 is set
AuthType Basic
Authname "Users zone"
AuthUserFile "/path/to/passwd"
Require valid-user
Satisfy any
Order allow,deny
Allow from all
Deny from env=PAGE1
SetEnvIf Request_URI "^/page/page2/$" PAGE2
# use BASIC authentication only when env variable PAGE2 is set
AuthType Basic
Authname "Users zone"
AuthUserFile "/path/to/passwd"
Require valid-user
Satisfy any
Order allow,deny
Allow from all
Deny from env=PAGE2
Ответ №1:
Написанные директивы должны работать нормально, однако существует ряд причин, которые могут помешать им работать должным образом:
- Конфликтует с другими директивами аутентификации.
- Когда запрос переписывается на передний контроллер WordPress, «запрошенный URL» обновляется, а переменные среды (
PAGE1
иPAGE2
в вашем примере) переименовываются сREDIRECT_
префиксом, поэтому доступ предоставляется при втором проходе. - На самом деле вы находитесь на сервере LiteSpeed (который идентифицирует себя как Apache 2.4). Модули обрабатываются в другом порядке (в частности, mod_rewrite перед mod_auth…), и переменные env, созданные на начальном проходе, теряются после перезаписи на интерфейсный контроллер WP.
Дополнительные примечания:
- Вы используете директивы аутентификации Apache 2.2, которые устарели в Apache 2.4.
- Похоже, нет никаких требований к наличию двух отдельных блоков правил, по одному для каждого URL-адреса.
Вместо этого мы можем использовать <If>
выражение Apache и вместо этого сверить URL THE_REQUEST
-адрес с переменной среды. THE_REQUEST
не обновляется при перезаписи URL-адреса, и это устраняет зависимость от переменных среды (которые могут быть переименованы или даже удалены).
THE_REQUEST
содержит всю первую строку заголовков запроса и содержит строку формы:
GET /page/page1/ HTTP/1.1
Однако THE_REQUEST
также содержит строку запроса (если таковая имеется), поэтому мы должны быть осторожны, чтобы исключить это в совпадении, иначе пользователь потенциально может обойти проверку подлинности, просто добавив строку запроса.
Вместо этого попробуйте выполнить следующее, чтобы проверить оба URL-адреса:
<If "%{THE_REQUEST} =~ m#s(/page/page1/|/page/page2/)(?|s)#">
AuthType Basic
Authname "Users zone"
AuthUserFile "/path/to/passwd"
Require valid-user
</If>