一个使用struts2的网站在登录页面需要进行redirect跳转,大致如下:

<package name="admin" extends="httl-default" namespace="/admin">
        <action name="login" class="com.zandili.tech.action.manage.LoginAdmin">
            <result name="success" type="httl">/admin/login.httl</result>
            <result name="error" type="redirect">/404</result>
            <result name="loginok" type="redirect">/admin/index.do</result>
        </action>
    </package>

这是struts2中再简单不过的逻辑了,本地测试一切正常,但经过nginx代理后,这个奇葩问题就出现了。

我们假定两台tomcat的webapps目录下都有一个app目录是我们网站应用的目录,nginx配置如下:

upstream app_up {
       server 192.168.0.5:8080;

server 192.168.0.6:8080;
    }
    server {
                listen  80;
                server_name www.zandili.com;

location / {
                         rewrite ^(.*)$ /app$1 break;
                         proxy_pass http://app_up;
                         proxy_redirect default;
                         proxy_set_header Host $host;
                         proxy_set_header X-Real-IP $remote_addr;
                         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

}

这样我们访问普通页面如http://www.zandili.com/index.do是没有问题的,nginx代理一切正常。

登录页面地址http://www.zandili.com/admin/login.do

提交表单后服务端判断用户登录成功后redirect到http://www.zandili.com/admin/index.do

这个时候我们用Firefox的firebug查看网络访问,就会发现,转向后的url地址为http://www.zandili.com/app/admin/index.do

目录中多了一个app目录,太意外了,app是后端tomcat下的目录,竟然在redirect的时候传递到了客户端,这不是我想要的。

此时更可怕的是如果程序里设置了404错误页,我们多了app目录的访问肯定找不到资源,就会无限重定向到404页面......

为这个问题苦恼啊,难道要为此放弃redirect不成?

曾经一度的解决方法是把网站部署到webapps下的ROOT目录,这样就不会多一个目录了(这是在逃避问题)。

仔细查看firebug提供的信息,发现这是个302重定向,多的这个app目录我只能理解为http://www.zandili.com/admin/login.do在进行redirect的时候,根据绝对路径获取到的是http://192.168.0.5:8080/app/admin/index.do的路径,nginx把这个跳转地址替换域名和端口后传递给客户端成http://www.zandili.com/app/admin/login.do这个地址重新发起请求,就出错了(这也就理解了redirect为什么是客户端转向)。

查了很多资料,一个字眼就频频出现,“proxy_redirect” ,这个在nginx里到底是什么作用?

NGINX的proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改。

现在问题就出在发送给客户端的URL没有修改成我们需要的路径,看来这个有利于解决问题。

我们对nginx里的配置稍加修改

upstream app_up {
       server 192.168.0.5:8080;

server 192.168.0.6:8080;
    }
    server {
                listen  80;
                server_name www.zandili.com;

location / {
                         rewrite ^(.*)$ /app$1 break;
                         proxy_pass http://app_up;
                         proxy_redirect default;#这个可以不要了,留着也没有啥危害
                         proxy_redirect http://www.zandili.com/app  http://$host:$server_port;
                         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_redirect http://www.zandili.com/app  http://$host:$server_port;

就是把服务端的跳转指令中的url进行修改,我们把app目录给抹掉再返回给客户端,这样就正常了。

看来还是有必要进一步学习下nginx的知识。

nginx反向代理tomcat应用,struts2网站程序redirect时导致请求地址错误的解决方法的更多相关文章

  1. nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题

    问题说明:测试机上部署了一套业务环境,nginx反向代理tomcat,在访问时长时间处于加载中,十分缓慢! 通过浏览器调试(F12键->Console),发现有错误ERR_CONTENT_LEN ...

  2. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集之安装Tomcat+Nginx反向代理Tomcat集群】

    1,安装Tomcat:和在windows下安装是一样的. 安装tomcat:上传后解压: tar -zxvf apache-tomcat-7.0.88.tar.gz -z:代表.gz格式的压缩包,-x ...

  3. Nginx反向代理tomcat返回400 bad request

    Nginx反向代理tomcat返回400 bad request nginx 版本1.12, tomcat版本 9.06 最近用Nginx做反向代理tomcat,实现前后端分离,nginx 将请求代理 ...

  4. docker,构建nginx反向代理tomcat

    Nginx实现负载均衡是通过配置nginx.conf来实现的,nginx.conf的全部内容如下: user nginx; worker_processes 1; error_log /var/log ...

  5. 启动android程序和虚拟机时候出现如下错误的解决方法

    启动android程序和虚拟机时候出现如下错误的解决方法. 错误重现: [2011-07-13 16:22:48 - Emulator] invalid command-line parameter: ...

  6. nginx反向代理Tomcat/Jetty获取客户端IP地址

    使用nginx做反向代理,Tomcat服务器和Jetty服务器如何获取客户端真实IP地址呢?首先nginx需要配置proxy_set_header,这样JSP使用request.getHeader(& ...

  7. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  8. Nginx反向代理+Tomcat+Springmvc获取用户访问ip

    Nginx+Tomcat+Springmvc获取用户访问ip 1.Nginx反向代理 修改Nginx配置文件 location / { ***********之前代码*******; proxy_se ...

  9. Nginx反向代理Tomcat静态资源无法加载以及请求链接错误

     在使用Nginx实现Tomcat的负载均衡的时候,项目发布到了Tomcat,Nginx也配置好了, 当访问的时候发现了与预期不符 表现为: 静态资源加载失败 链接跳转地址错误 下面是我错误的配置文件 ...

随机推荐

  1. 一、Ajax 二、JSON数据格式 三、Ajax+Jquery 四、分页的实现

    一.Ajax概述###<1>概述 ###<2>组成 以XMLHttpRequest为核心,发送Ajax请求和接收处理结果 以javascript为语言基础 以XML/JSON作 ...

  2. 关于idea通过smalidea无源调试apk

    idea 14.0.2 可以使用 smalidea 0.03 单步时,只能按照源码中的行号(line xxx)指定的行跳动, 可以使用鼠标选中变量即时查看变量值 idea 16/17 可以使用smal ...

  3. [python] 修改Tkinter 的默认图标

    先上一个不修改的样式,如下: import easygui as g g.msgbox("hello","hi") 注意左上角的图标为红色的Tk字样 修改后: ...

  4. oracle备份与恢复

    Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP).热备份和冷备份.导出备件是一种逻辑备份,冷备份和热备份是物理备份. 导出/导入(Export/Import) 利用Exp ...

  5. 关于datatables与jquerUI版本冲突问题

    今天开发项目是,需要用到表格,于是想到,之前的项目中使用过datatables插件,于是就拿了过来,但是发现无法识别 Uncaught TypeError: $(...).DataTable is n ...

  6. linux sqlplus查询数据中文乱码解决方法记录

    locale-gen -lang en.US.UTF-8 重启.

  7. python第三十二课——队列

    队列:满足特点 --> 先进先出,类似于我们生活中的买票.安检 [注意] 对于队列而言:python中有为其封装特定的函数,在collections模块中的deque函数就可以获取一个队列对象; ...

  8. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest): #1.打开两个文件:1个关联读操作,1个关联写操作 fr=open(src,'rb ...

  9. VGA、DVI、HDMI、DP 接口介绍及优劣

    VGA.DVI.HDMI.DP 接口介绍及优劣   随着日新月异的发展,就目前显卡上面常见的输出接口而言,我们所熟知的有以下几种: VGA.DVI.HDMI和DP (DisplayPort). 这四种 ...

  10. BZOJ1211:[HNOI2004]树的计数(组合数学,Prufer)

    Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要 ...