我已經用這個問題廢話了,並沒有提出任何意見,所以希望你們可以提供幫助。Apache的mod_proxy_html與PHP頭(「Location:...」);不重定向
目標
配置反向代理(使用Apache的mod_proxy),以便能夠在使用mod_proxy_html重寫我的應用程序的URL互聯網訪問到內部的PHP應用程序。從我的httpd.conf
<?php
header("Location:http://internal.example.com/landing.php");
?>
在這個片段:
問題描述
僅與該代碼考慮landing.php:
<a href="redirect.php">redirect.php</a>
且僅redirect.php
UseCanonicalName On
LoadFile /usr/lib64/libxml2.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule xml2enc_module modules/mod_xml2enc.so
<VirtualHost *:80>
ServerName example.com
<Proxy *>
Order deny,allow
Allow from all
AllowOverride None
</Proxy>
ProxyPass/http://internal.example.com/
ProxyPassReverse/http://internal.example.com/
ProxyHTMLLinks a href #Commenting out this line fixes the problem, but I need it for rewriting
ProxyHTMLEnable On
RequestHeader unset Accept-Encoding
</VirtualHost>
當我去http://example.com/landing.php並點擊「redirect.php」時,它應該帶我回到landing.php頁面。相反,我在Firefox中收到了「此連接已重置」,或者Chrome中收到了「未收到數據」。 (僅供參考,要http://internal.example.com/redirect.php重定向正確。)
問題:
爲什麼重定向將無法通過反向代理去,我怎麼能解決這個問題?
提示
我已經發現了幾件事情,可能有幫助...
我知道,如果我註釋掉「ProxyHTMLLinks A HREF」,這將正常工作。但顯然,這是我需要的重寫功能。
我也可以改變redirect.php頁面下面,這正常工作:
<?php
header("Location:http://internal.example.com/landing.php");
?>
random text
我想這段文字在某種程度上做了頁面或HTTP頭,使mod_proxy_html(或更具體ProxyHTMLLinks)操作不同於沒有它。
我還可以在redirect.php頁面更改爲以下和它的工作:
<?php
header("Location:http://internal.example.com/landing.php");
header("Content-Type:");
?>
這工作,因爲ProxyHTMLLinks,默認情況下,僅適用於內容類型text/html的文件。但是,我不希望將所有對頭部的調用(「位置:...」)進行破解以使其工作。我不介意把所有的呼叫都改爲header(「Location:...」),假設我正在改變的是糾正一個問題,而不是創建一個黑客。
最後,我在反向代理服務器上做了一些數據包嗅探,發現頭(「Location:...」)向反向代理服務器發送一個HTTP/1.1 302 Not Found,但它沒有'將它傳遞給請求redirect.php的瀏覽器。當我嘗試上面的「解決方案」之一時,302然後從反向代理服務器傳遞到請求redirect.php的計算機。 我的理解是Location標頭應該到達瀏覽器,然後瀏覽器應該請求傳回的新位置。所以它是失敗的,因爲302不會讓它瀏覽器...我試過看看錯誤日誌,看看mod_proxy_html是否在某處失敗,但我什麼都看不到,儘管我對於關於日誌記錄的具體建議持開放態度,因爲我並不是100 %確定我是否正確設置了日誌記錄。
對不起,這是如此之久,只是儘可能具體。 在此先感謝!