Warm tip: This article is reproduced from serverfault.com, please click

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

(Adding Basic Authentication to Nginx that contains existing Rewrite rules)

发布于 2021-03-19 08:20:06

我有通过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块中的“ try_files”行所致。

我尝试了很多Nginx指令的变体,包括Basic Auth块内的404 /命名位置技巧,但我陷入了诸如“不允许在命名位置块内进行位置”,“如果是邪恶的”(!)和“在auth_basic之前总是重写操作”。

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

===更新===

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

希望你能理解我简化了上面的设置,并且如果我对两种用户类型都有单独的阻止,则实际上还有很多重写规则可以在基本身份验证和开放用户之间重复。谢谢。

Questioner
Jason
Viewed
0
Jason 2019-01-25 22:25:08

我使用了前面提到的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.
  }
}