Удалить заголовок WWW-Authenticate
У меня есть страница на моем apache, которую я защищаю с помощью Basic Auth.
С помощью JavaScript я хочу проверить, есть ли в браузере учетные данные для этой страницы или нет, поэтому я хочу загрузить страницу с помощью jQuery. ajax
звоните, надеясь получить либо страницу, либо 401
ошибка. К сожалению, браузер всегда запрашивает у меня учетные данные в последнем случае, который я не хочу - я просто хочу знать, нужны ли мне учетные данные или нет!
Я читал, что браузер только спрашивает, WWW-Authenticate:
заголовок установлен, поэтому я хочу его отключить или отредактировать, чтобы браузер не знал об этом.
Это мое .htaccess
(строка редактирования взята с coderwall.com):
Authtype Basic
AuthName "abcdef"
AuthUserFile some/folder/at/the/xampp/.htpasswd
Require valid-user
Header always add HelloHello "Blupp"
Header always edit WWW-Authenticate ^Basic SR_Basic
Это (частично) то, что я получаю с curl -I <url>
:
HTTP/1.1 401 Unauthorized
Date: Thu, 14 Sep 2017 12:48:52 GMT
Server: Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.6.21
WWW-Authenticate: Basic realm="abcdef"
Vary: accept-language,accept-charset
Accept-Ranges: bytes
Content-Type: text/html; charset=utf-8
Content-Language: en
Вы видите, WWW-Authenticate
заголовок не изменяется, а HelloHello
заголовок не был применен! Когда я закомментирую первые 4 строки (базовая аутентификация), я правильно получаю HelloHello: Blupp
,
Используя линию Header always unset WWW-Authenticate
вместо этого не приносит никаких изменений.
Как я могу изменить / подавить заголовок?
1 ответ
Проблема здесь в том, что модули Apache загружаются и обрабатываются.
Вы можете увидеть порядок модулей, запустив эту команду:
apache2ctl -M
Вы увидите, что модуль auth_*_ загружается до модуля headers_module, поэтому вы не можете добавлять заголовки или изменять существующие.
Загруженные модули: ... ... auth_basic_module (общий доступ) auth_digest_module (общий доступ) authn_core_module (общий доступ) authn_file_module (общий доступ) authz_core_module (общий доступ) authz_groupfile_module (общий доступ) authz_host_module (общий доступ) authz_user_module (общий доступ)...... headers_module (общий доступ)......
При просмотре документации Apache порядок загрузки модулей определяется в собственном исходном коде модуля.
Я проследил, что Apache 2.4.25 (как в Debian 9 "stretch") добавляет заголовок "WWW-Authenticate" в mod_auth_basic.c (в r->err_headers_out) и затем обрабатывает директиву конфигурации Apache "Header" в mod_headers.c, которая к сожалению, работает с другой копией r-> err_headers_out в mod_headers.c:ap_headers_error_filter().
При добавлении второй функции do_headers_fixup() в ap_headers_error_filter (), как это делается в ap_headers_output_filter() для работы с r->headers_out, проблема также исчезла.
Не уверен, что Apache считает эту проблему ошибкой или функцией.
Обновление: Соответствующий отчет о проблеме на apache.org, включая предложенный патч, находится по адресу: https://bz.apache.org/bugzilla/show_bug.cgi?id=62025