
我見過如何使用反向代理程式正確處理相對 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,您的第一個範例也應該可以工作。