Nginx-如果存在身份验证标头,如何返回 404?

Nginx-如果存在身份验证标头,如何返回 404?

我在 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;
    }

    ...
  }
}

以上将阻止所有带有授权标头的请求,无论其位于何处。

相关内容