Учитывая следующий http-блок, nginx выполняет так, как ожидалось. То есть, он перепишет URL-адрес, такой как http://localhost/3ba48599-8be8-4326-8bd0-1ac6591c2041/
, http://localhost/modif/3ba48599-8be8-4326-8bd0-1ac6591c2041/
и передает его на сервер uwsgi.Почему моя директива nginx «переписать» вызывает цикл перенаправления?
http {
upstream frontend {
server frontend:8000;
}
server {
listen 8000;
server_name localhost;
root /www/;
location ~* "^/([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})/?$" {
include uwsgi_params;
set $uuid $1;
if ($cookie_admin) {
# if cookie exists, rewrite /<uuid> to /modif/<uuid> and pass to uwsgi
rewrite//modif/$uuid break;
uwsgi_pass frontend;
}
content_by_lua_block {
ngx.say("Ping! You got here because you have no cookies!")
}
}
}
}
Однако, когда я добавить еще один location
блок в манере отображения удара, вещи падают Appart и я получаю ERR_TOO_MANY_REDIRECTS
.
http {
# access_log /dev/stdout; # so we can `docker log` it.
upstream frontend {
server frontend:8000;
}
server {
listen 8000;
server_name localhost;
root /www/;
location/{ # THIS MAKES EVERYTHING FALL APART :(
uwsgi_pass frontend;
include uwsgi_params;
}
location ~* "^/([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})/?$" {
include uwsgi_params;
set $uuid $1;
if ($cookie_admin) {
# if cookie exists, rewrite /<uuid> to /modif/<uuid> and pass to uwsgi
rewrite//modif/$uuid break;
uwsgi_pass frontend;
}
content_by_lua_block {
ngx.say("Ping! You got here because you have no cookies!")
}
}
}
}
Что здесь происходит, точно? Как я могу это исправить?
Какой URL-адрес вызывает проблему и на что она перенаправляется? –
@RichardSmith, любой URL-адрес, который был захвачен регулярным выражением местоположения (например, '/', приведет к ошибке, отмеченной мной. Я представил пример одного из таких URL в вопросе. Я не уверен, как я могу проверьте, где он перенаправляется. Беглый взгляд на инструменты для Chrome-хроники, кажется, предполагает, что он захватывается одним и тем же блоком местоположения снова и снова (но опять же, я не уверен). –
blz
Я не использую хром, но похоже, что вкладка resources -> headers покажет вам детали. Поле 'location' в заголовке ответа - это то, что вы ищете. Поскольку ваша конфигурация' nginx' не создает внешние перенаправления, она, вероятно, исходит из upstream application. –