指定返回时,位置块中的 auth_basic 不起作用?

Posted

技术标签:

【中文标题】指定返回时,位置块中的 auth_basic 不起作用?【英文标题】:auth_basic within location block doesn't work when return is specified? 【发布时间】:2017-03-19 17:53:45 【问题描述】:

我认为这会起作用,但由于某种原因,它会跳过 auth_basic 并始终返回 200。如果我将 200 换成 301 重定向,也会发生同样的情况。

如果我注释掉 return 语句,它可以正常工作。理想情况下,我只想要一个 /auth 端点,一旦经过身份验证,它将 301 重定向到另一条路径。

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

     return 200 'hello';
  

我错过了什么吗?

非常感谢

fLo

【问题讨论】:

【参考方案1】:

return-directives 在大多数其他指令之前执行。要解决您的问题,您需要将其分成两个位置:

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 的结果进行评估。

【讨论】:

好的,谢谢,确认工作。我试图找到一些证实这一点的文档,但无法在 nginx 站点或其他地方找到它。如果有人有一些可以确认这是预期行为或错误的地方?谢谢。 我从未找到有关此的官方文档。源代码证实了这种行为,并且有这个演示文稿:de.slideshare.net/joshzhu/nginx-internals,请参见幻灯片 37 及以下内容。 return-directive 属于重写模块。还有这篇文章:nginxguts.com/2011/01/phases 这在您还想设置 cookie 时不起作用。 add_header Set-Cookie "foo=bar" before try_files 什么都不做。 @Rihad add_header 指令需要进入指定位置(在返回之前),然后写入 cookie。这是因为请求实际上是在这个位置处理的,即内容和标头是在那里创建的。

以上是关于指定返回时,位置块中的 auth_basic 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

从用符号Tab等等方式正在划分的文字块中,取出指定了位置的文字块

文本块中的水平调整不起作用

同一位置块中的多个 if 如何交互?

nginx返回错误状态码401

获取我在 OsmDroid 中的位置不起作用

iOS:XCUITest 中的模拟器位置不起作用