У меня есть изображения, успешно обработанные с помощью правила перезаписи 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.
}
}