Когда кто-то посещает сайт, я хочу, чтобы у него был определенный набор файлов cookie.
Такой cookie проверяется через auth_request, и 403 должен появиться на экране входа в систему (необходим HTML / PHP, поэтому нет auth_basic).
При успешной аутентификации он перенаправляет на «foo.example.org».
Поэтому я написал конфиг и все, что в прокси, и все это.
Проблема в том, что браузер входит в foo.example.org, запоминает предыдущее перенаправление и продолжает перенаправлять на экран входа в систему.
Что я могу изменить, чтобы браузер не перенаправлял (из своего кеша)?
Что-то вроде «foo.example.org?auth» может быть предметом или иметь полностью внутреннюю аутентификацию.
server {
server_name foo.example.org;
location / {
auth_request /restricted;
error_page 403 = @error403;
proxy_pass http://10.12.34.56;
resolver 127.0.0.11 ipv6=off;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location @error403 {
return 307 /restricted;
}
location /restricted {
proxy_pass http://auth_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
Вы возвращаете 307 Temporary Redirect
ответ вместо 403 Forbidden
, он, вероятно, просто кешируется в браузере, поэтому продолжает перенаправлять. Это просто делает то, что вы говорите, чтобы сделать.
В любом случае, вы делаете жизнь трудной для себя, на самом деле это сделать намного проще.
Используйте директиву map, чтобы проверить наличие cookie и установить пользовательскую переменную в зависимости от значения. Предположим, что им нужно печенье secret
иметь значение password
чтобы попасть в:
map $cookie_secret $notloggedin {
default 1;
password 0;
}
Сейчас $notloggedin
всегда будет установлен на 1
если запрос клиента не имеет cookie secret=password
то будет установлено 0
который в Nginx также равняется пустому / неустановленному.
Теперь мы помещаем эту переменную в условие if в блоке location. Существует некоторая путаница в отношении использования условий в местах, и многие люди скажут вам, что вы не должны их использовать, но документы четко заявить:
Единственные 100% безопасные вещи, которые можно сделать внутри, если в месте
контекстом являются:вернуть …;
переписать … последний;
Так что это будет хорошо.
location / {
if ($notloggedin) {
return https://example.com/login;
}
Люди без cookie теперь перенаправляются на страницу входа.
Других решений пока нет …