目錄
- 前言
- Nginx 根據域名反向代理
- Nginx proxy_pass 關於 '/' 的做用前端
接到一個需求,經過nginx 代理互聯網上某一個頁面,剛開始的時候以爲很簡單的,直接 proxy_pass 過去就完事了,測試了下仍是想太多。具體記錄以下。nginx
web服務器一般有三種訪問方式:web
而互聯網上暴露的網站多數都是經過 基於域名 的方式,若是直接經過解析後的IP訪問,可能就沒法訪問到網站信息。我這裏模擬了下這種方式,以下:瀏覽器
對應關係:bash
瀏覽器訪問域名:服務器
瀏覽器訪問ip地址:dom
如今問題來了,當你的 nginx 配置 proxy_pass 的時候,獲得的是 域名返回的結果 仍是 ip地址返回的結果呢?這兩種返回的結果徹底不一樣。測試
在另外一臺主機 [ 192.168.118.14 ] 上安裝 nginx 並配置好 網站
配置nginx 方向代理 spa
經過瀏覽器訪問 192.168.118.14
查看日誌信息:
192.168.118.41 - - [23/Jul/2019:20:09:12 +0800] "GET / HTTP/1.1" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-" "upstream_addr":"112.2.3.66:80"
結合上面的反饋, 能夠獲得,當 nginx 反向代理域名,會根據啓動時候解析出來的ip,加載到內存中,後面不會改變能夠綁定hosts或者指定resolve服務器來固定ip
若是在使用 nginx 作反向代理的時候遇到以上相同的狀況,解決辦法是 設置一個 proxy_set_header
proxy_set_header Host "[domain]";
配置完成,nginx -s reload 瀏覽器訪問:
如今就獲得想要的頁面了。
有這樣一個服務器訪問以下:
訪問 http://192.168.118.15 獲得
訪問 http://192.168.118.15/a/
在這臺主機前端須要添加一個反向代理。配置以下:
第一種配置:
當這樣配置的時候,訪問 http://192.168.118.14/a/ 結果以下:
總結:
proxy_pass http://192.168.118.14/a/ --> http://192.168.118.15/
第二種配置:
當這樣配置的時候,訪問 http://192.168.118.14/a/ 結果以下:
總結:
proxy_pass http://192.168.118.14/a --> http://192.168.118.15/
綜上所述:
當 proxy_pass 不加 '/' 時, location uri 會追加到 proxy_pass http://domain/ 後面;
當 proxy_pass 加 '/' 時,不會在 proxy_pass http://domain 後面追加任何uri
切記以上兩條規則。