1. 程式人生 > >nginx反向代理tomcat,由於客戶端輸入的埠不一致造成網頁basehref錯誤的問題及解決辦法

nginx反向代理tomcat,由於客戶端輸入的埠不一致造成網頁basehref錯誤的問題及解決辦法

由於埠限制的原因,外網開放的埠是8080,而nginx監聽的埠是80,通過埠對映,是外網8080對映至nginx所在主機的80埠上(假設nginx所在主機的ip是192.168.0.1,外網域名是domain.com)。這就導致通過外網訪問,瀏覽器輸入的地址是domain.com:8080,而在內網訪問則是192168.0.1:80,也就是說,客戶端發給nginx的請求的頭域中HOST的值可能有兩種埠80和8080.而nginx在代理客戶端向tomcat發請求時,請求頭中的HOST的埠預設是80。因此,tomcat接收到請求後,抓取到的埠號是80。因此,如果jsp中設定了basehref,就會造成無論客戶端輸入的埠號是80還是8080,basehref中寫入的埠號一定是80。因此如果客戶端輸入的地址是domain:8080,客戶端可以獲取到頁面,但是網頁中所有src都錯誤,如圖片,外鏈css、js,iframe等等,以及超連結也都錯誤,因為jsp中的basehref中的埠是80。

http請求頭中並不包含port(埠)一項,埠是和地址一起在寫HOST裡的。nginx可以通過配置檔案設定代理髮請求時host的值。host中包含的埠資訊nginx只能設定為三種:預設(也就是80)、變數(nginx監聽的埠或瀏覽器佔用的埠)、常量(比如12345),也就是說,nginx並不能提取出客戶端發來請求中的埠資訊作為變數設定。因此,當客戶端請求的host中埠可能有多個時,nginx無法通過變數提取到埠號。

另外port_in_redirect off只能讓瀏覽器不做重定向,並不能改變nginx發請求時的埠號。

解決辦法:

1.把base href去掉,如果沒有basehref,瀏覽器會自動按照當前地址來定位,需要注意的是,如果去掉base href,那麼網頁中的連結就成了相對路徑,如果網頁在子目錄的話就會出現連結錯誤。

2.一般這個問題不太常見,因為一般能通過外網訪問的,無需再通過內網訪問。因此可以在nginx中陪置固定的轉發埠號:host $host:8080。這樣一來,外網通過訪問domain.com:8080的請求在轉發給tomcat時,host中的埠號就變成了8080,內網通過192.168.0.1:80訪問的會出現問題,但是可以不予考慮。但是如果有此需要,可以通過配置主機名來設定固定埠解決。在nginx的配置檔案中,加一個server配置,其中server_name設定為:192.168.0.1,然後設定host $host:80.這樣一來,如果客戶端輸入的地址是通過內網ip192.168.0.1:80來訪問的,nginx在發請求時就會將請求頭的host中埠號設定為80.