2013-02-26 64 views
1

我已經用這個問題廢話了,並沒有提出任何意見,所以希望你們可以提供幫助。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 %確定我是否正確設置了日誌記錄。

對不起,這是如此之久,只是儘可能具體。 在此先感謝!

回答

0

我想通了這個問題。我需要顯式傳遞Content-Type頭中的字符集才能工作。 這是通過添加:

AddDefaultCharset utf-8 

到我的Apache配置文件。這個全局固定的所有對頭部(「位置:...」)的調用不需要向每個頭添加頭部(「Content-Type:」)或頭部(「Content-Type:text/html; charset = utf-8」)其中之一。

簡而言之,我所說的mod_proxy_html的ProxyHTMLLinks會導致302 Found不會從反向代理服務器轉發到客戶端,如果a)內容類型是text/html(並因此ProxyHTMLLinks)適用, b)charset未設置,並且c)您的頁面沒有傳回內容。

在我看來,這是正常情況。處理表格輸入的頁面通常滿足所有三個標準。

有可能出於某種原因,這是預期的功能,並且我正在做其他事情,但我看不到那會是什麼。至少在這裏有一個優雅的鍛鍊,以防有人發現它有用。