我在 Internet 上有一个代理应用程序的 nginx 实例。我希望对任何来自 Internet 的尝试向该应用程序进行身份验证的请求返回 404,因为该应用程序的所有公共部分都允许匿名访问。只有本地网络上的用户才能对其进行身份验证。
我想我可以使用一个简单的 if 块,因为我只是使用 return 404,但我不确定什么是最可靠的 if 条件来检测身份验证标头的存在:
if (auth headers exist) {
return 404;
}
有人对我可以在 if 块中放入什么来检查这一点有什么建议吗?
答案1
一般来说,不推荐使用 if 语句,或者您至少应该注意一些副作用。阅读nginx 博客上的“If is Evil”了解更多。
回答你的问题:假设你想要检查的标题被称为“授权”,你最初的假设已经非常准确了。
if ($authorization) {
return 404;
}
这应该已经解决了问题。此外,如果您只想对公共服务器块强制执行此操作,您可以使用ngx_http_access_module
答案2
您可以检查请求中是否存在 Authorization 标头,该标头通常用于验证请求。您可以使用 if 块中的 $http_authorization 变量来执行此操作:
if ($http_authorization) {
return 404;
}
或者,您可以检查应用程序使用的特定身份验证标头是否存在。例如,如果您的应用程序使用 X-Auth-Token 作为身份验证标头,您可以像这样检查它:
if ($http_x_auth_token) {
return 404;
}
请记住,仅当请求发送到受 auth_basic 指令保护的位置时,才会评估 if 块。如果您想检查所有请求中是否存在身份验证标头,则可以改用 map 指令:
map $http_authorization $block_public_auth {
default 0;
"~" 1;
}
server {
...
location / {
if ($block_public_auth) {
return 404;
}
...
}
}
以上将阻止所有带有授权标头的请求,无论其位于何处。