Добавление базовой аутентификации в 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) вместо image.

Я думал, что если поместить блок Basic Auth над блоком Rewrite, поток будет переходить от одного блока к другому. Теперь я понимаю, что это из-за строки «try_files» в блоке Basic Auth.

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

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

=== UPDATE ===

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

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

1
задан 25 January 2019 в 13:14
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.
  }
}
0
ответ дан 4 December 2019 в 03:18

Теги

Похожие вопросы