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