解決Nginx location中配置proxy_pass轉發(fā)時斜線‘/‘導致404問題
nginx location配置proxy_pass轉發(fā)時斜線‘/‘導致404
在Nginx location通用匹配規(guī)則中配置proxy_pass轉發(fā)時
假設有如下location配置:
location /test { proxy_pass http://localhost:8080/test; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Proto "https"; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; }
如果我請求 http://localhost/test/a.jsp,則會將url根據匹配規(guī)則“/test”截取,然后將“/test”后面的內容(此處為“/a.jsp”)拼接到proxy_pass的后面,然后轉發(fā),也就是最后實際請求地址為:proxy_pass http://localhost:8080/test/a.jsp。
所以,如果location的匹配規(guī)則最后不加斜線'/',則proxy_pass的最后也不要加斜線,或者都加上斜線,不然就不能正確訪問實際地址,導致404 not found錯誤。
注:正則匹配不適用,關于location的匹配規(guī)則,可以參考其他資料。
nginx反向代理中proxy_pass后面帶\和不帶\的坑
1. proxy_pass中帶\和不帶\的問題
(1)在nginx中配置proxy_pass時,當在后面的url加上了/,相當于是絕對根路徑,則nginx不會把location中匹配的路徑部分代理走;
(2)如果沒有/,則會把匹配的路徑部分也給代理走。
2. 舉例
下面四種情況分別用http://192.168.1.4/proxy/test.html 進行訪問。
(1)
location /proxy/ { proxy_pass http://127.0.0.1:81/; }
由于port后面有/ ,則不會代理匹配的路徑,所以最終會被代理到: http://127.0.0.1:81/test.html
(2)
location /proxy/ { proxy_pass http://127.0.0.1:81; }
由于port后面沒有/ , 則會代理匹配的路徑,所以最終會被代理到: http://127.0.0.1:81/proxy/test.html
(3)
location /proxy/ { proxy_pass http://127.0.0.1:81/ftlynx/; }
由于port后面有/ ,則不會代理匹配的路徑,所以最終會被代理到: http://127.0.0.1:81/ftlynx/test.html
(4)
location /proxy/ { proxy_pass http://127.0.0.1:81/ftlynx; }
由于port后面有/ , 則不會代理匹配的路徑,所以最終會被代理到: http://127.0.0.1:81/ftlynxtest.html
心得:
- 從結果可以看出,應該說分為兩種情況才正確。
- 即http://127.0.0.1:81(上面的第二種)和 http://127.0.0.1:81/…(上面的第1,3,4種)
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Nginx安裝lua-nginx-module模塊的方法步驟
ngx_lua_module 是一個nginx http模塊,這篇文章主要介紹了Nginx安裝lua-nginx-module模塊的方法步驟,非常具有實用價值,需要的朋友可以參考下2018-12-12