
在 Apache 伺服器(Xampp)上,我製作了一個用於防火牆過濾的轉發代理,效果很好,但我不明白如何使用 RewriteRule 將禁止的 url 重定向到自訂錯誤頁面。
我希望將請求重定向到我的伺服器上存在的本地錯誤 html 文件,以通知客戶端它向我的代理請求的 URL 是否未經授權。
在下面的範例中,我只放置了不起作用的部分(我還有其他 RewriteRule 用於允許的 url):
Listen 192.168.0.100:3128
<VirtualHost 192.168.0.100:3128>
ServerName 192.168.0.100:3128
ProxyRequests On
ProxyVia On
<Proxy *>
# 1) If url is allowed (this part works well):
... some RewriteCond & RewriteRule ...
# 2) If url is not allowed by some RewriteCond:
RewriteRule ^ https://192.168.0.100/firewall/firewall_deny.html [R=302,L]
OR
RewriteRule ^ https://192.168.0.100/firewall/firewall_deny.html [P,L]
</Proxy>
</VirtualHost>
當 url 被允許時(情況 1),代理運作良好,Chrome 會收到所請求網站的頁面。但如果我已禁止某個網址(情況 2),則代理將不會回覆。
我嘗試了很多不同的語法,但 Chrome 瀏覽器從未從我的伺服器收到任何答复,只是顯示其錯誤頁面:“此網站不可用”,錯誤為“ERR_TUNNEL_CONNECTION_FAILED”。
僅在正向代理的情況下(我不進行反向代理),是否可以將自訂 html 檔案(或其 url)發送回客戶端?
謝謝你的幫助
23/10 編輯:
這個小代理程式運作良好,但我唯一不知道要做的就是當 url 被禁止時向客戶端發送回錯誤頁面。
這就是為什麼我問 <Proxy *> 中使用的 RewriteRule 是否可以授權連接,也可以用於重定向到錯誤頁面,就像我們在正常配置(不是代理)中所做的那樣。就像是 :
RewriteRule ^ https://192.168.0.100/path/to/firewall/firewall_deny.html [R=302,L]
顯然重定向已經完成,因為在 Fiddler 中我可以看到帶有新網址的 302 重定向頁面,但 chrome 似乎沒有收到它。
我也嘗試過類似的事情:
Redirect permanent path/to/firewall/
但在這個轉送代理配置中,它似乎也不起作用。也許您必須以某種方式重寫標頭或其他內容,以將錯誤頁面的 url 發送回 chrome,因為它通過代理隧道。
目前,我正在嘗試使用 ServerDefault 上找到的其他解決方案,例如 ExtFilterDefine (mod_ext_filter.so) 或 Substitute (mod_substitute.so),但到目前為止尚未成功。