auth_basic в блоке местоположения не работает, когда указан возврат?

я думал, что это сработает, но по какой-то причине он пропускает auth_basic и всегда возвращает 200. То же самое произойдет, если я поменяю 200 на перенаправление 301.

Если я закомментирую оператор возврата, он работает нормально. В идеале мне нужна только конечная точка /auth, которая после аутентификации будет перенаправлять 301 на другой путь.

 location /auth {
     auth_basic_user_file /etc/nginx/.htpasswd;
     auth_basic "Secret";

     return 200 'hello';
  }

Я что-то упускаю ?

огромное спасибо

фло


person Flo Woo    schedule 06.11.2016    source источник


Ответы (1)


return-директивы выполняются перед большинством других директив. Чтобы решить вашу проблему, вам нужно разделить это на два места:

location /auth {
  auth_basic_user_file /etc/nginx/.htpasswd;
  auth_basic "Secret";
  try_files DUMMY @return200;
}

location @return200 {
  return 200 'hello';
}

Директива try_files оценивается после auth_basic. Второе местоположение оценивается только как результат try_files.

person Digitalkapitaen    schedule 07.11.2016
comment
Хорошо, спасибо, подтвердил работу. Я попытался найти документацию, подтверждающую это, но не смог найти ее ни на сайте nginx, ни где-либо еще. Если у кого-нибудь есть подтверждение, что это ожидаемое поведение или, может быть, ошибка? Спасибо. - person Flo Woo; 07.11.2016
comment
Официальной документации по этому поводу я так и не нашел. Исходный код подтверждает это поведение и вот эта презентация: de.slideshare.net/joshzhu/nginx-internals см. слайд 37 и последующие. Директива return принадлежит модулю перезаписи. Также эта статья: nginxguts.com/2011/01/phases - person Digitalkapitaen; 08.11.2016
comment
Это не работает, когда вы также хотите установить файл cookie. add_header Set-Cookie foo=bar до того, как try_files ничего не сделает. - person Rihad; 07.08.2018
comment
@Rihad Директива add_header должна находиться в указанном месте (до возврата), после чего записывается файл cookie. Это связано с тем, что запрос фактически обрабатывается в этом месте, т. е. контент и заголовки создаются там. - person Digitalkapitaen; 08.08.2018