nginx代理添加servlet路径

Posted

技术标签:

【中文标题】nginx代理添加servlet路径【英文标题】:nginx proxy adding servlet path 【发布时间】:2012-06-17 12:35:12 【问题描述】:

我有 Tomcat 6 在路径“be”上运行 Web 应用程序。 Spring Security 用于登录过程。登录网址为/console/login,登录后重定向至/console/customer。我对login url 使用https,对customer URL 使用http。我没有在任何 spring 配置文件中指定 servlet 路径。一切正常,访问/be/console/login 后收到正确的重定向(到/be/console/customer)。

现在我想要一个代理。我将 nginx 配置为将 https://localhost 转发到 https://<someip>:9443 和 http 一样,从端口 80 转发到端口 9080。

问题是 Nginx 正在向浏览器返回无效的重定向。相反/be/console/customer 它返回/be/be/console/customer。 Servlet 路径被添加到 URL 中两次。

第二个“是”怎么可能被删除?

谢谢。

Nginx 配置:

server 
    listen       443 ssl;
    server_name  localhost;

    ssl                  on;        
    ssl_certificate      C:\jc\\nginx\\tc\selfsigned.cer;
    ssl_certificate_key  C:\jc\\nginx\\tc\private.key;

    ssl_session_timeout  5m;

    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    location / 
            proxy_redirect          off;
            proxy_pass              https://<some ip>:9443;
            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;
     

    location ~ /.+ 
            proxy_redirect          off;
            proxy_pass              https://<some ip>:9443;
            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;
       

server 
    listen       80;
    server_name localhost;

    access_log  logs/access.log;
    error_log  logs/error.log;

    location /                 
            proxy_redirect          off;
            #server_name_in_redirect    off;
            proxy_pass              http://<some ip>:9080;              
            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;
     

    location ~ /.+ 
            proxy_redirect          off;                
            proxy_pass              http://<some ip>:9080;
            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;
    

【问题讨论】:

【参考方案1】:

此配置正在生产中工作:

location /demo/ 
    proxy_pass  http://localhost:8080;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_pass_request_headers on;

    client_max_body_size       10m;
    client_body_buffer_size    128k;

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;

    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;

【讨论】:

proxy_pass_request_headers 默认开启,其余(不同参数)只是与性能相关的配置。所以问题要复杂得多。

以上是关于nginx代理添加servlet路径的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 如何设置反向代理

nginx 添加代理

问题解决1:nginx反向代理丢失js、css问题

nginx自动添加内网端口

Nginx 配置反向代理 Tomcat

nginx反向代理增加虚拟目录