Apache-2.2

在 Apache 中尋找等效的 ProxyPassReverseMatch 來修復缺少的尾部正斜杠問題

  • May 3, 2013

我有兩個 Web 伺服器,www.example.com 和 www.userdir.com。我正在嘗試將 www.example.com 作為前端代理伺服器,以提供*http://www.example.com/~username*格式的請求,例如

http://www.example.com/~john/

以便它發送一個內部請求

http://www.userdir.com/~john/

www.userdir.com。我可以在 Apache 中實現這一點

ProxyPass /~john http://www.userdir.com/~john 
ProxyPassReverse /~john http://www.userdir.com/~john

ProxyPassReverse是必要的,因為沒有它,像*http://www.example.com/~john>*這樣沒有尾隨斜杠的請求將被重定向為*<http://www.userdir.com/~john/*並且我希望我的使用者留在 example.com 空間。

現在,我的問題是我有很多使用者,我無法在 httpd.conf 中列出所有這些使用者名。所以,我用

ProxyPassMatch ^(/~.*)$ http://www.userdir.com$1

但是Apache中沒有**ProxyPassReverseMatch這樣的東西。**沒有它,只要 URL 中缺少尾部正斜杠,就會將其定向到 www.userdir.com,這不是我想要的。

我還嘗試了以下方法來添加尾部正斜杠

RewriteCond %{REQUEST_URI} ^/~[^./]*$ 
RewriteRule ^/(.*)$ http://www.userdir.com/$1/ [P]

但隨後它將呈現一個帶有損壞圖像和 CSS 的頁面,因為它們連結到*http://www.example.com/images/image.gif而它應該是http://www.example.com/~john/images /圖像.gif*。

我已經在Google上搜尋了很長時間,但仍然無法找到一個好的解決方案。如果有人能對這個問題有所了解,我將不勝感激。謝謝!

在修復重定向時,您可以忽略使用者名和後面的任何內容:

ProxyPassReverse /~ http://www.userdir.com/~

因為這只是前綴替換。

我認為您沒有正確理解 ProxyPassReverse 指令的功能。這是文件的摘錄:

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypassreverse

該指令允許 Apache 調整 HTTP 重定向響應的 Location、Content-Location 和 URI 標頭中的 URL。當 Apache 用作反向代理(或網關)時,這是必不可少的,以避免由於後端伺服器上的 HTTP 重定向而繞過反向代理,這些伺服器位於反向代理後面。

**只有上面特別提到的 HTTP 響應頭會被重寫。**Apache 不會重寫其他響應標頭,**也不會重寫 HTML 頁面內的 URL 引用。**這意味著如果代理內容包含絕對 URL 引用,它們將繞過代理。將查看 HTML 內部並重寫 URL 引用的第三方模組是 Nick Kew 的 mod_proxy_html。

此外,您不希望在任何 URL 中自動添加尾部斜杠 - 這會破壞很多連結。

現在,要在使用者目錄後強制使用斜杠,我會這樣做:

RewriteRule ^/(~\w+)(/(.+)?)?$ http://www.userdir.com/$1/$3 [P]

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