Nginx位置不带斜杠仅适用于带斜杠

时间:2018-06-28 14:17:25

标签: amazon-web-services nginx reverse-proxy apache-zeppelin

使用nginx作为Zeppelin实例的反向代理存在一个奇怪的问题。我将尝试在下面描述问题。

我正在使用EC2实例作为反向代理来访问Zeppelin实例。前面的一个注释是作为“转发代理”的AWS ALB,通过这种方式,我可以使用友好的URL来公开UI。 AWS ALB上的path based routing已正确配置。

  1. 请求将通过域 subdomain.domain.com/ds 发送到AWS ALB,在这里我使用基于路径的路由来匹配所有将/ ds作为路径的请求到我的目标群体。

  2. 然后将传入请求传递到运行良好的Nginx实例。问题是,如果我使用不带斜杠的URL,则Nginx只会超时。

配置如下:

# Zeppelin
server {
    listen 541;
    location /ds {
        rewrite ^/ds/(.*)$ /$1 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/(.*)$ /$1 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

1 个答案:

答案 0 :(得分:1)

在您的location块中:

location /ds {
    rewrite ^/ds/(.*)$ /$1 break;
    ...  
    proxy_pass ...
}
/ds/开头的

URI将与正则表达式匹配,并且不使用初始的/ds进行重写。但是,URI /ds与正则表达式不匹配,它将作为/ds传递到上游应用程序。

有多种方法可以解决此问题,但是最简单的解决方案是通过添加/运算符使正则表达式中的第二个?成为可选变量。

例如:

rewrite ^/ds/?(.*)$ /$1 break;