位置正则表达式在 NGINX 上表现异常

位置正则表达式在 NGINX 上表现异常

今天我向大家介绍了我的 NGINX 反向代理上的一个非常奇怪的行为。

我使用它作为 tomcat 服务器的反向代理,并设置主机配置如下:

server {
        listen  80;
        server_name hostname.domaine.tld;

        access_log /var/log/nginx/hostname.access.log;
        error_log /var/log/nginx/hostname.errors.log;

        include errors.conf;
        include proxy.conf;

        location = / {
            deny all;
        }

        location = /manager/(?<uri>\w+)$ {
            deny all;
        }

        location ~ ^/(?<uri>\w+)$ {
            proxy_pass http://recette/$uri;
        }
}

长话短说,我的目标是允许访问此主机上的资源,如下所示:

主机.域名.tld/资源名称/(.*)

但我还想拒绝对以下 URL 的任何访问:

主机.域名.tld/

主机.domaine.tld/管理器/

主机.域名.tld/管理器/(.*)

这里我的配置似乎不起作用,据我所知,这是因为第三个位置始终是正确的,即使您在配置文件上设置了第二个位置,在这种情况下,您也始终被授予访问管理器虚拟主机的权限,即使它被明确拒绝。

因此,我想就这个问题向您寻求一点帮助,因为我认为我的正则表达式不正确。

答案1

好的,终于明白了!

我弄乱了我的正则表达式:'(

这是最终的配置文件,它完全按照预期运行:D

server {
    listen  80;
    server_name hostname.domaine.tld;

    access_log /var/log/nginx/hostname.access.log;
    error_log /var/log/nginx/hostname.error.log;

    include errors.conf;
    include proxy.conf;

    location ~ ^/$ {
        deny all;
    }

    location ~ ^/manager/(?<$uri>)$ {
        deny all;
    }

    location ~^/(?<$uri>)$ {
        proxy_pass http://recette/$uri;
    }
}

确实存在两个问题,第一个是“=”符号需要完全匹配。第二个是添加的 (w+) 与 (?) 指令提供的现有捕获所有正则表达式相冲突。

所以,感谢观众,并且抱歉打扰了 ^^

相关内容