没有尾部斜杠的 Nginx 位置仅适用于尾部斜杠
Nginx location without trailing slash works only with trailing slash
我在使用 nginx 作为我的 Zeppelin 实例的反向代理时遇到了一个奇怪的问题。我将尝试描述下面的问题。
我正在使用 EC2 实例作为反向代理来访问 Zeppelin 实例。前面的注释是一个 AWS ALB,作为 "forward proxy",这样我就可以使用友好的 URL 来公开 UI。 AWS ALB 上的 path based routing 配置正确。
请求通过域 subdomain.domain.com/ds 到达 AWS ALB,我在其中使用基于路径的路由来匹配所有将 /ds 作为我的目标组路径的请求。
然后将传入的请求传递给运行良好的 Nginx 实例。问题是,如果我使用的 URL 没有尾部斜线,Nginx 就会超时。
配置如下:
# Zeppelin
server {
listen 541;
location /ds {
rewrite ^/ds/(.*)$ / break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://10.10.10.10:8890/;
proxy_redirect http://10.10.10.10:8890/ $scheme://$host/ds;
}
location /ds/ws {
proxy_pass http://10.10.10.10:8890/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection upgrade;
proxy_read_timeout 86400;
}
}
此外,下面是我为 RStudio 使用的最简单的示例。
server {
listen 542;
location /ds {
rewrite ^/ds/(.*)$ / break;
proxy_pass http://10.10.10.10:8787;
proxy_redirect http://10.10.10.10:8787/ $scheme://$host/ds/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_read_timeout 20d;
}
}
如果没有提供尾部斜线,我会得到
/ds not found
在你的 location
区块中:
location /ds {
rewrite ^/ds/(.*)$ / break;
...
proxy_pass ...
}
以 /ds/
开头的 URI 将匹配正则表达式并在没有初始 /ds
的情况下重写。但是,URI /ds
与正则表达式不匹配,将作为 /ds
.
传递给上游应用程序
有多种方法可以解决此问题,但最简单的解决方案是通过添加 ?
运算符使正则表达式中的第二个 /
可选。
例如:
rewrite ^/ds/?(.*)$ / break;
我在使用 nginx 作为我的 Zeppelin 实例的反向代理时遇到了一个奇怪的问题。我将尝试描述下面的问题。
我正在使用 EC2 实例作为反向代理来访问 Zeppelin 实例。前面的注释是一个 AWS ALB,作为 "forward proxy",这样我就可以使用友好的 URL 来公开 UI。 AWS ALB 上的 path based routing 配置正确。
请求通过域 subdomain.domain.com/ds 到达 AWS ALB,我在其中使用基于路径的路由来匹配所有将 /ds 作为我的目标组路径的请求。
然后将传入的请求传递给运行良好的 Nginx 实例。问题是,如果我使用的 URL 没有尾部斜线,Nginx 就会超时。
配置如下:
# Zeppelin
server {
listen 541;
location /ds {
rewrite ^/ds/(.*)$ / break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://10.10.10.10:8890/;
proxy_redirect http://10.10.10.10:8890/ $scheme://$host/ds;
}
location /ds/ws {
proxy_pass http://10.10.10.10:8890/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection upgrade;
proxy_read_timeout 86400;
}
}
此外,下面是我为 RStudio 使用的最简单的示例。
server {
listen 542;
location /ds {
rewrite ^/ds/(.*)$ / break;
proxy_pass http://10.10.10.10:8787;
proxy_redirect http://10.10.10.10:8787/ $scheme://$host/ds/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_read_timeout 20d;
}
}
如果没有提供尾部斜线,我会得到
/ds not found
在你的 location
区块中:
location /ds {
rewrite ^/ds/(.*)$ / break;
...
proxy_pass ...
}
以 /ds/
开头的 URI 将匹配正则表达式并在没有初始 /ds
的情况下重写。但是,URI /ds
与正则表达式不匹配,将作为 /ds
.
有多种方法可以解决此问题,但最简单的解决方案是通过添加 ?
运算符使正则表达式中的第二个 /
可选。
例如:
rewrite ^/ds/?(.*)$ / break;