为什么我的nginx是;重写;导致重定向循环的指令?

为什么我的nginx是;重写;导致重定向循环的指令?,nginx,openresty,nginx-location,Nginx,Openresty,Nginx Location,给定以下http块,nginx将按预期执行。也就是说,它将重写一个URL,如http://localhost/3ba48599-8be8-4326-8bd0-1ac6591c2041/至http://localhost/modif/3ba48599-8be8-4326-8bd0-1ac6591c2041/并将其传递给uwsgi服务器 http { upstream frontend { server frontend:8000; } server

给定以下http块,nginx将按预期执行。也就是说,它将重写一个URL,如
http://localhost/3ba48599-8be8-4326-8bd0-1ac6591c2041/
http://localhost/modif/3ba48599-8be8-4326-8bd0-1ac6591c2041/
并将其传递给uwsgi服务器

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!")
            }
        }
    }
}

到底是怎么回事?如何修复此问题?

我看到您的Nginx正在侦听端口8000,但您的上游服务器位于“前端”,也在端口8000上。如果
frontend
解析到运行Nginx的同一台服务器,那么就会出现代理请求循环

我看到您的Nginx正在侦听端口8000,但您的上游服务器位于“前端”,也在端口8000上。如果
frontend
解析到运行Nginx的同一台服务器,那么就会出现代理请求循环

哪个URL导致了问题,它被重定向到了什么?@RichardSmith,位置正则表达式捕获的任何URL(即,
/
将导致我注意到的错误;我在问题中提供了一个这样的URL示例。我不确定如何检查它被重定向到哪里。粗略地看一下chrome开发者工具似乎表明它被同一个位置块一次又一次地捕获(但我也不确定)。我不使用chrome,但看起来resources->headers选项卡应该会显示详细信息。响应标题中的
位置
字段就是您要查找的。由于您的
nginx
配置似乎没有生成外部重定向,它可能来自上游应用程序。@RichardSmith,似乎不是o在
/
/modif/
之间来回移动。当添加
位置/
块时,上游应用程序的参与将如何解释行为的变化?这只是猜测-但在添加新块之前,重定向到
/modif
将导致静态文件或者404错误。如果是JS或CSS之类的资源文件,您可能没有注意到错误。哪个URL导致了问题,它被重定向到了什么?@RichardSmith,location regex捕获的任何URL(即,
/
将导致我注意到的错误;我在问题中提供了一个这样的URL示例。我不确定如何检查它被重定向到哪里。粗略地看一下chrome开发者工具似乎表明它被同一个位置块一次又一次地捕获(但我也不确定)。我不使用chrome,但看起来resources->headers选项卡应该会显示详细信息。响应标题中的
位置
字段就是您要查找的。由于您的
nginx
配置似乎没有生成外部重定向,它可能来自上游应用程序。@RichardSmith,似乎不是o在
/
/modif/
之间来回移动。当添加
位置/
块时,上游应用程序的参与将如何解释行为的变化?这只是猜测-但在添加新块之前,重定向到
/modif
将导致静态文件或者404错误。如果是JS或CSS之类的资源文件,您可能不会注意到该错误。您也会想到它,但如果是这样的话-它在第一个配置示例中不起作用我也会想到它,但如果是这样-它在第一个配置示例中不起作用
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!")
            }
        }
    }
}