Вы возвращаете ответ 307 Temporary Redirect
вместо 403 Forbidden
, возможно, он просто кешируется в браузере, поэтому перенаправление продолжается.Он просто делает то, что вам говорят.
В любом случае вы делаете жизнь себе тяжелой, на самом деле это намного проще.
Используйте директиву map для проверки на наличие cookie иустановить пользовательскую переменную в зависимости от ее значения.Предположим, им нужен cookie secret
, чтобы получить значение password
для входа:
map $cookie_secret $notloggedin {
default 1;
password 0;
}
Теперь $notloggedin
всегда будет иметь значение 1
, если в запросе клиента нет cookie secret=password
,тогда он будет установлен на 0
, что в Nginx также равно пустому / неустановленному.
Теперь мы переместим эту переменную в условие if в блоке location.Существует некоторая путаница в отношении использования условий в местах, и многие люди скажут вам, что вы не должны их использовать, но документы четко указывают:
Единственное100% безопасные вещи, которые можно сделать внутри, если в контексте местоположения:
return ...;переписать ... last;
Так что все будет в порядке.
location / {
if ($notloggedin) {
return https://example.com/login;
}
Люди без cookie теперь перенаправляются на страницу входа.