Базовая аутентификация HTTP в Apache показывает файлы, когда я отменяю вход

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