
我設定了動態 DNS,並且希望能夠從家外存取不同的電腦。目前我有一個在 192.168.1.2 上運行 nginx 的樹莓派,我的路由器在 192.168.1.1 上。我還將連接埠 80 從路由器轉發到樹莓派,因此只需點擊動態 DNS URL 即可在我的 pi 登陸頁面上顯示 phpinfo() 頁面。
接下來,我希望能夠mydns.com/device1
在後台重定向到其他裝置的同時維護該 URL。
換句話說,我會看到http://mydns.com/device1
,但我會http://192.168.1.3
在內部訪問。此外,如果我輸入,mydns.com/device1/login
它將在內部重定向到http://192.168.1.3/login
.
sub_filter
我嘗試像這樣使用:
sub_filter_once off;
sub_filter_types text/html;
sub_filter ""http://192.168.1.3" "http://192.168.1.2"
proxy_pass http://192.168.1.3/;
proxy_set_header Host $host;
這在一定程度上發揮了作用,但並不完全。路徑不會重定向,例如子資料夾中的檔案。例如:
我要這個:
http://mydns.com/device1/style/basic.css
但得到這個:
http://mydns.com/style/basic.css
這會導致 404,如 Chrome 的控制台視圖中所示。我收到此錯誤:
Failed to load resource: the server responded with a status of 404 (Not Found)
這是在路上:http://mydns.com/style/basic.css
但我需要http://mydns.com/device1/style/basic.css
。
我可以透過在網址列中輸入 來存取 CSS 檔案http://mydns.com/device1/style/basic.css
。所以我知道它是可以訪問的,我只是無法讓 NGINX 轉發/重寫這些資料夾。
有人可以幫忙嗎?謝謝
答案1
可能有幾個原因:
- 要嘛在你的 URI 使用 proxy_pass 輸入位置之前重寫你的 URI;
- 或它在先前處理的某些位置中作為匹配的子 URI 提供;
- 或者(在您的 nginx 版本中)proxy_pass 指令中 IP 後面的斜杠
/
會導致 nginx 將斜杠作為代理 URI 並在發送之前重寫它。
如果不查看您的整個配置,人們就無法看到您這邊到底發生了什麼事。或者您可以嘗試啟用偵錯日誌(以查看導致此問題的原因)。
無論如何,與上述理由相關,你有 3 種方法來解決這個問題:
- 要嘛避免重寫,要嘛必須
rewrite ... break
在 proxy_pass 之前添加額外的內容來擴展 URI; - 或者您可以嘗試將其定義為
proxy_pass http://192.168.1.3/device1/;
或使用某些(映射)變數來定義proxy_pass http://192.168.1.3/$device/;
,甚至使用完整的原始 URI 來定義proxy_pass http://192.168.1.3$request_uri;
(注意這裡沒有/
)。 - 或者您可以嘗試刪除尾部斜杠,因此
proxy_pass http://192.168.1.3;
(不含斜杠)而不是proxy_pass http://192.168.1.3**/**;
(帶斜杠)
在這種情況下,“請求URI 以與處理原始請求時客戶端發送的形式相同的形式傳遞到伺服器” (如果沒有發生重寫),或「在處理變更的 URI 時傳遞完整規範化的請求 URI」(如果發生了一些重寫或您有一些帶有別名的臨時位置並try_files ... @proxy
已傳遞)。
看一眼代理通行證proxy_pass 使用的所有可能變體的文檔。