向包含现有重写规则的 Nginx 添加基本身份验证

向包含现有重写规则的 Nginx 添加基本身份验证

我已通过 Nginx 重写规则成功提供图像:

# Rewrite part ==============
location ~* "^/([a-z]{5})/([0-9]{5}).png$" {
  rewrite .* "/$1/image_handler.php?x=$2" last;
}

现在我需要向此服务添加基本身份验证。我从下面的基本身份验证块开始,现在我的配置如下所示:

# Basic Auth part ===========
location ~ ^/my-user-(?<user_id>[^/]+) {
  try_files $uri $uri/ =404;
  auth_basic "Restricted Content";
  auth_basic_user_file /path/to/passwords/my-user-$user_id;
}

# Rewrite part ==============
location ~* "^/([a-z]{5})/([0-9]{5}).png$" {
  rewrite .* "/$1/image_handler.php?x=$2" last;
}

这在提示输入登录详细信息时会起作用,直到提交正确的密码,但之后,这一次,我收到错误(404/500)而不是图像。

我以为将 Basic Auth 块放在 Rewrite 块上方,流程就会从一个块流向另一个块。现在我意识到这是因为 Basic Auth 块中的“try_files”行。

我尝试了多种 Nginx 指令,包括 Basic Auth 块内的 404/命名位置技巧,但我被诸如“位置不允许在命名位置块内”、“if 是邪恶的”(!) 和“在 auth_basic 之前重写始终操作”等规则所困扰。

最终,我无法找到一种方法来实现将基本身份验证添加到上面的初始重写规则中的简单任务。

=== 更新 ===

我忘了补充说还有其他用户,比如说“open-user-xxx”(以及“my-user-xxx”)不需要基本身份验证,但需要直接访问相同的重写规则。

希望您能理解我简化了上述设置,如果我为这两种用户类型设置了单独的块,那么实际上会有相当多的重写规则会在 Basic Auth 和 Open 用户之间重复。谢谢。

答案1

我使用前面提到的 404/named_location 技巧并克服了之前遇到的 nginx 规则限制。

以下是对我有用的方法:

# Basic Auth part ===========
location ~ ^/my-user-(?<user_id>[^/]+) {
  auth_basic "Restricted Content";
  auth_basic_user_file /path/to/passwords/my-user-$user_id;

  # Go to Rewrite part
  error_page 404 = @imageHandlers;
}

# Go to Rewrite part anyway (without auth)
error_page 404 = @imageHandlers;

# Rewrite part ==============
location @imageHandlers {
  # Handle image1 ==============
  if ($uri ~* "^/([a-z]{5})/([0-9]{5}).png$") {
    rewrite .* "/$1/image_handler.php?x=$2" last;
  }

  # Handle image2 ==============
  if ($uri ... {
    etc.
  }
}

相关内容