1. 程式人生 > >nginx反向代理java web應用,網頁連結的問題

nginx反向代理java web應用,網頁連結的問題

假如有一個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解決問題的原理相同,都是讓應用訪問路徑為根目錄,只是實現方式不同。