2012-04-25 24 views
2

在過去的幾個小時裏,這讓我瘋狂。似乎PHP/Apache/Pound/Haproxy(無法真正說出)堅持將頁面重定向到之前的同一個方案/域,儘管我明確指出它應該是另一個方案/域。PHP/Apache調用「header:location」覆蓋方案?

背景:我們通常有一個連接到https:\\ secure.example.com安全域的http:\\ www.example.com域(注意不同的子域)。這使我們的開發變得簡單,因爲我們沒有爲所有開發人員/項目提供SSL證書,我們只需檢查URL是否以「安全」開頭。對於這個項目,客戶希望https:\\ www.example.com作爲一個安全域,所以我想:沒問題,我只是改變邏輯來檢測生產。那部分工作正常。

然而,在某些情況下,用戶需要從安全轉移到不安全,例如,當登錄並重定向到主頁時。我已經收窄到這個簡單的測試案例(注:安全和非安全的公共目錄只是符號連接彼此):

<?php 

// this is our server-specific way of detecting secure/non-secure in production 
if (isset($_SERVER['HTTP_X_SSL_CIPHER'])) { 
     header("HTTP/1.1 Moved permanently", true, 301); 
     header("Location: http://www.example.com/test.php"); 
} 
echo 'bubbles!'; 

你希望它調用HTTPS一次後重定向:\ \ www.example.com/test.php,然後回顯「泡泡!」。但是,我的瀏覽器堅持將其重定向回httpS:\\ www.example.com/test.php,從而導致無限循環。

如果我用HTTP元刷新和/或JavaScript重定向替換頭調用一切正常,但我真的希望它與位置標題一起工作。 Apache/PHP/Pound/Haproxy似乎正在爲自己決定我應該堅持安全域,即使我明確告訴他們不要。

另一個有趣的事情要注意的是,反向(從非安全重定向到安全)似乎工作正常。另外,在使用https:\\ secure.example.com方案的其他網站(在同一臺服務器上),一切工作都正常,可能是因爲子域不同。

有沒有人有任何想法,爲什麼這可能會發生,是什麼原因造成的?我們的服務器設置是:將https請求分發到8080端口上的隱藏Web服務器,然後haproxy對80端口(以及其他一些類似IMAP的內容)執行相同的安全操作,並在後面加上一些普通的香草Apache Web服務器。

我能想到的唯一情況是,負載平衡器搞亂了一切,但這沒有意義,因爲從Web服務器的回覆直接發送回客戶端AFAICT ...任何想法,任何人?

N.B.用反斜槓替換了示例中的斜槓,或者認爲我會張貼「太多鏈接」。它們不是鏈接,它們是示例域。如果我想發佈一個鏈接,我會添加一個錨點。

+0

你的數據包嗅探器說...? – 2012-04-25 18:52:13

+0

好吧,它表示重定向在服務器級別被改變,所以這個問題很可能與PHP和/或Apache和/或我們的設置有關。客戶端只需接收https >> https重定向,即使我明確指出它應該是https >> http。對不起,應該在OP中更清楚一點。 – Marijn 2012-04-25 23:57:39

回答

0

找到它;如果域名匹配(在這種情況下他們這樣做),龐德默認將任何位置標題重寫爲「最初請求的內容」。請參閱ListenHTTPS部分中的「RewriteLocation 0 | 1 | 2」;應該設置爲0(「不要這樣做」)在我的情況。