是否可以拒绝所有未发送基本身份验证数据的 nginx 请求?
我有这样的要求:
xxx.xxx.xxx.xxx - - [24/Oct/2012:10:32:12 +0200] "POST /path HTTP/1.1" 401 1387 "-" "Apache-HttpClient/4.1.1 (java 1.5)" "-"
xxx.xxx.xxx.xxx - paul [24/Oct/2012:10:32:12 +0200] "POST /path HTTP/1.1" 200 192 "-" "Apache-HttpClient/4.1.1 (java 1.5)" "-"
我想拒绝第一个不提供用户的请求。如您所见,它已经发送了 401 HTTP 代码,但此代码不是直接从 nginx 生成的,而是从底层应用程序服务器生成的。我想要做的是直接在 nginx 中拒绝它。有没有办法检查是否提供了用户?
如果不直接在 nginx 中设置正常的基本身份验证,这可能吗?
答案1
Nginx 将身份验证得到的用户名存储在$remote_user
。您应该能够测试它是否为空,并相应地执行所需的操作(例如返回 401 错误)。类似于:
if ($remote_user = ''){
return 401;
}
从外观上看,您已经填充了$remote_user
变量(因为它出现在您的日志中) - 据我所知,您必须使用 Nginx 的HTTP Auth 基本模块填充该变量。
基本身份验证会设置授权标头。在 Nginx 中,HTTP 请求标头可通过 访问$http_HEADER
,因此在本例中为$http_authorization
。如果您在 Nginx 之外实施基本身份验证并设置该标头,则可以测试该标头是否为空。(或者,根据您实施身份验证的方式,您可以设置要测试的自定义标头)。