NGINX - 將請求重新導向到另一個 IP,同時保留 URL

NGINX - 將請求重新導向到另一個 IP,同時保留 URL

我設定了動態 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 使用的所有可能變體的文檔。

相關內容