Назад | Перейти на главную страницу

Добавление базовой аутентификации в 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 location внутри блока Basic Auth, но я застрял с такими правилами, как «местоположение не разрешено внутри блока именованного местоположения», «if is evil» (!) И "всегда перезаписывать действия перед auth_basic".

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

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

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

Надеюсь, вы понимаете, что я упростил свою настройку выше, и на самом деле есть еще несколько правил перезаписи, которые были бы дублированы между пользователями Basic Auth и Open, если бы у меня были отдельные блоки для обоих типов пользователей. Спасибо.

Я прибегаю к уловке 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.
  }
}