nginx反向代理java web应用,网页链接的问题

来源:互联网 发布:好考试软件 编辑:程序博客网 时间:2024/06/05 22:53

假如有一个java web应用,地址是10.0.0.1:8080/aaa,用nginx做代理,域名a.com指向nginx,nginx代理发请求给10.0.0.1:8080/aaa.如果jsp中有以下对<base href='">的配置,则会出现网页链接错误的问题:


<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">

这是因为basePath变量是由多个从request获取的值组成的,其中String path = request.getContextPath();表明path变量是由上下文路径决定的,而上下文路径是应用在web服务器中设置的,实际上就使应用的目录路径,默认就是应用目录的名称,和http请求无关,因此无论怎样配置nginx,网页的base href中都会带有应用路径/aaa,如果是通过a.com访问的应用,就会出现链接错误,因为对于浏览器来说当前网站的主机名是a.com,但是链接指向的地址是a.com/aaa/*。

解决办法有三个:

1.将应用目录名改为web服务器的默认根目录名,比如tomcat下讲应用目录aaa改为ROOT,这样应用目录就是根目录,通过10.0.0.1:8080即可访问。这样做,path变量就是空字符串,与客户端访问的应用路径一致。

2.去掉base href,链接都写绝对或相对路径。如果写绝对路径则要注意也需要将应用目录改为根目录,因为如果不改为根目录,则绝对路径要写/aaa/*,这样客户端如果通过a.com访问应用,链接显示的地址也是a.com/aaa/*。这个链接错误其实和指定base href出现的错误是同样的原因,因为实际上base href就是将相对路径变为基于主机名和项目名的绝对路径。

3.配置web服务器,通过指定应用目录的虚拟目录,将应用目录设置为根目录。比如在tomcat中配置server.xml:

<Host name="localhost" debug="0" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
       <Alias>localhost.com</Alias> 
       <Logger className="org.apache.catalina.logger.FileLogger"
                 directory="logs"  prefix="localhost_log." suffix=".txt"
            timestamp="true"/>
        <Context path="" docBase="F:\tomcat\webapps\aaa"  reloadable="true" caseSensitive="false" debug="0"></Context>
</Host>

其中Context path="" 将应用目录设置为根目录,这样访问10.0.0.1:8080即可访问应用。和方法1解决问题的原理相同,都是让应用访问路径为根目录,只是实现方式不同。

0 0