Мне было интересно, могу ли я заставить apache отправлять HTTP 401 вместо HTTP 403 в случае сбоя какого-либо условия внутри RequireAll. Удивительно, но я обнаружил AuthzSendForbiddenOnFailure, который вынуждает 403 вместо 401. Но как быть с противоположным? Как я могу заставить apache повторно запросить логин и пароль в случае неудачной авторизации?
Редактировать: Я посмотрел журнал отладки прямо сейчас. Дело в том, что если я введу только Требуется действительный пользователь в разделе RequireAll , в журнале я вижу "отказано (пользователь еще не авторизован)" ,Тем не менее, если я добавлю Require env SMTH дополнительно, apache проверит Требуется действительный пользователь , но затем, после сбоя с "denied (еще не авторизован пользователь)" , он также проверит мой второй Require и потерпит неудачу только с "denied" и выдаст HTTP 403. Я думаю, что это ошибка. Почему apache проверяет наличие второго Require в RequireAll, если первое уже не удалось?
Edit2: Похоже, оно еще не было реализовано: https://github.com/apache/httpd/blob/trunk/modules/aaa/mod_authz_core.c#766
if (child_result != AUTHZ_NEUTRAL) {
/*
* Handling of AUTHZ_DENIED/AUTHZ_DENIED_NO_USER: Return
* AUTHZ_DENIED_NO_USER if providing a user may change the
* result, AUTHZ_DENIED otherwise.
*/
if (section->op == AUTHZ_LOGIC_AND) {
if (child_result == AUTHZ_DENIED) {
auth_result = child_result;
break;
}
if ((child_result == AUTHZ_DENIED_NO_USER
&& auth_result != AUTHZ_DENIED)
|| (auth_result == AUTHZ_NEUTRAL)) {
auth_result = child_result;
}
}
else {
/* AUTHZ_LOGIC_OR */
if (child_result == AUTHZ_GRANTED) {
auth_result = child_result;
break;
}
if ((child_result == AUTHZ_DENIED_NO_USER
&& auth_result == AUTHZ_DENIED)
|| (auth_result == AUTHZ_NEUTRAL)) {
auth_result = child_result;
}
}
}