Apache-2.4

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

  • November 30, 2021

我已經看到如何使用反向代理正確處理相對 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。

引用自:https://serverfault.com/questions/1084980