今天我向大家介绍了我的 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+) 与 (?) 指令提供的现有捕获所有正则表达式相冲突。
所以,感谢观众,并且抱歉打扰了 ^^