在 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
不能被這個處理……所以它仍然是一個懸而未決的問題(對我來說)如何代理“一切”
使用正確的基本 URL 配置您的後端伺服器。這比在代理上強制重寫要容易得多。
設置應該是
JAWANNDENN_URL_PREFIX
。只需將其設置為/jaw
,所有 URL 都應正確生成。然後,您的第一個範例應該可以工作,即使沒有 ProxyHTMLURLMap 和 OutputFilter。