在 Apache 2.4 中同一伺服器的相對 url(“子目錄”)上代理“連接埠”應用程式?

在 Apache 2.4 中同一伺服器的相對 url(“子目錄”)上代理“連接埠”應用程式?

我見過如何使用反向代理程式正確處理相對 URL- 但是我很難理解這一點(並將其應用於我的問題),希望有人能提供幫助。

假設我的伺服器上有 Ubuntu 20.04 作為伺服器作業系統example.com

然後,我安裝https://github.com/hartwork/jawanndenn在伺服器上,並運行它 - 該應用程式預設在連接埠 8080 上運行;我可以透過執行以下命令來確認它在伺服器本身上運行:

wget -O- http://127.0.0.1:8080

到目前為止,一切都很好。現在,我想要的是:https://example.com:8080我不想訪問此應用程序,而是想訪問https://example.com/jaw- 我通常稱之為/jaw“子目錄”,但更準確地說,它可能是一個相對 URL。換句話說,如果我正確理解術語,https://example.com/jaw將反向代理到https://example.com:8080.

所以,我嘗試在<VirtualHost *:443>我的文件的定義中這樣做.conf

  <Location /jaw>
    Options -Multiviews -Indexes
    RewriteEngine On
    ProxyPass         http://127.0.0.1:8080
    ProxyPassReverse  http://127.0.0.1:8080
    SetOutputFilter proxy-html
    ProxyHTMLURLMap http://127.0.0.1:8080
  </Location>
  RewriteRule ^/jaw$ /jaw/ [R]

這是有效的 - 從某種意義上說,應用程式的起始頁面已加載;但無法載入大量資源(.css、.js);在瀏覽器中開啟控制台,我可以看到一堆 404 個請求:

https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...

所以,我的猜測是,有一些 .js 文件或類似文件,只是想加載/static/...-> 如果從“端口”地址調用,它們會映射到http://127.0.0.1:8080/static/...並且一切都會很好;但現在,由於我們被代理了:

  • 瀏覽器請求https://example.com/jaw
  • Apache 獲取該訊息,將其轉發到https://example.com:8080應用程式偵聽的地方
  • 應用程式傳回檔案 (.js),其中包含表單中的鏈接/static/...
  • 一旦它們返回瀏覽器,它們就會被解釋為https://example.com/static/...- 在用作伺服器請求之前,伺服器將無法找到它們

我還嘗試刪除<Location>上面的整個片段,並在<VirtualHost *:443>節點中使用它:

  ProxyPass /jaw/ http://127.0.0.1:6789/
  ProxyPassReverse /jaw/ http://127.0.0.1:6789/

與之前的情況完全相同 - 第一個頁面被加載,所有其他資源顯然都被引用,/static/...並且它們都是 404。

最後,我也擺脫了上面的陳述,並使用了這個:

  ProxyPass /jaw/  http://127.0.0.1:8080
  ProxyHTMLURLMap http://127.0.0.1:8080  /jaw
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

這具有完全相同的行為 - 第一頁加載,資源失敗 - 除了資源現在在瀏覽器控制台中列出為:

https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...

....他們因 502 代理錯誤而失敗。所以進行了一些重寫,但有些東西仍然不對。

所以我的問題是 - 我該如何對 Apache 說,對代理一切從 127.0.0.1:8080 上的應用程式到顯示為「子目錄」的內容(相對 URL?此處/jaw)?


編輯:事實證明,502 代理錯誤是由於:

AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js

……很明顯缺少一條斜線;所以結果是這樣的:

  ProxyPass /jaw/  http://127.0.0.1:8080/
  ProxyHTMLURLMap http://127.0.0.1:8080/  /jaw/
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

....實際上確實有效 - 大部分(/static資源);但隨後,有一個電話/data沒有得到處理......所以這仍然是一個懸而未決的問題(對我來說)如何代理“一切

答案1

使用正確的基本 url 設定您的後端伺服器。這比在代理上強制重寫要容易得多。

設定應該是JAWANNDENN_URL_PREFIX.只需將其設為/jaw,所有 URL 都會正確生成。

即使沒有 ProxyHTMLURLMap 和 OutputFilter,您的第一個範例也應該可以工作。

相關內容