Добавление базовой аутентификации в Nginx, которая содержит существующие правила перезаписи

У меня есть изображения, успешно обработанные с помощью правила перезаписи Nginx:

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

Теперь мне нужно добавить базовую аутентификацию для этого сервиса. Я начал с блока Basic Auth ниже, и теперь моя конфигурация выглядит следующим образом:

# 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, поток будет переходить из одного блока в другой. Теперь я понимаю, что это из-за строки try_files в блоке Basic Auth.

Я попробовал довольно много вариантов директив Nginx, в том числе трюк с 404/named в блоке Basic Auth, но я застрял с такими правилами, как "location не разрешено в блоке named", "if is evil"(!) И msgstr "переписывать всегда действия перед auth_basic".

В конечном итоге я не могу найти способ решить простую задачу добавления базовой аутентификации в мое первоначальное правило перезаписи выше.

=== ОБНОВЛЕНИЕ ===

Я забыл добавить, что есть другие пользователи, скажем, "open-user-xxx" (а также "my-user-xxx"), которым не требуется Basic Auth, НО нужен прямой доступ к тому же правилу перезаписи.

Надеюсь, вы можете оценить, что я упростил мою настройку выше, и на самом деле есть еще несколько правил перезаписи, которые были бы дублированы между пользователями 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.
  }
}
Другие вопросы по тегам