auth_request 失败后如何返回 403 而不是 500 响应代码

auth_request 失败后如何返回 403 而不是 500 响应代码

在 auth_request nginx 模块返回 403 后,是否可以返回 403 响应代码,以便向用户显示禁止指令而不是 500 内部服务器错误,后者没有太多信息量。

答案1

这可能会有帮助:

如果您想显示自己的页面而不是 DotCloud 提供的默认错误页面,您必须使用一些技巧。

首先,请注意,这仅适用于嵌入了 Nginx 服务器的堆栈。对于其他堆栈,DotCloud 负载均衡器将是用户和应用程序之间的唯一层,目前,它只能提供默认错误页面。

您需要告诉 Nginx 做所有这些事:

使用自定义静态页面来处理 502 和 504 错误;将错误代码重新映射到例如 500(否则,DotCloud 负载均衡器将提供默认的 502 和 504 页面);拦截 uwsgi/fastcgi 发送的错误(否则,我们的自定义静态页面将不会被使用);减少默认超时,这样您的超时处理程序将在平台范围的超时处理程序之前启动。假设您的错误页面位于 /static/502.html 和 /static/504.html,您可以使用以下 nginx.conf 代码片段:

PHP的:

fastcgi_read_timeout 10;
fastcgi_intercept_errors on;
error_page 502 =500 /static/502.html;
error_page 504 =500 /static/504.html;

Perl/Phython:

uwsgi_read_timeout 10;
uwsgi_intercept_errors on;
error_page 502 =500 /static/502.html;
error_page 504 =500 /static/504.html;

红宝石:

对于 Ruby 应用程序,由于 Passenger 将使用错误代码 500,因此无需重写。默认的 Nginx 配置已经为此提供了一个处理程序 (errorpage 500 /static/500.html)。此外,由于 Passenger 没有公开配置变量来更改超时,因此您无法提供自定义 504 页面。

在 Nginx 中启用了 Intercept_errors 后,您就无法再生成自己的错误页面,例如 HTTP 代码 500、403 等。您还必须在 Nginx 中为这些错误定义静态页面。此限制将在服务的未来版本中取消。

来源:http://docs.dotcloud.com/guides/5xx/

否则,请查看此页面http://wiki.nginx.org/NginxVariableTutorialCn06提供了不错的教程。[尽管我建议通过 Google Chrome 翻译页面...]

答案2

感谢 Zero Stack 的帮助,但我自己偶然发现了答案,看来我一开始就犯了一个配置错误。我将 nginx 配置为透明 SSL 代理,以通过 SSL 连接提供 http 内容。对于身份验证,我使用了 auth_request 模块,该模块不包含在 nginx 的标准包中。

所以现在,每当我拒绝身份验证服务器的请求时,nginx 都会提供一个 500er 页面,这看起来很奇怪,因为模块应该设置 403 错误代码。但我不明白为什么 nginx 会将其解释为 500 错误。偶然间我发现我应该将 proxy_pass 配置为不拦截错误页面!

我的具体问题的解决方案是设置:

proxy_intercept_errors off;

嗯,有什么意见吗?如何处理赏金?

相关内容