2012-03-22 115 views
3

當我嘗試從SSL加密頁面切換回非加密(https - > http)時,我遇到無限重定向循環中卡住的情況。我們目前的配置設置的背後,創建一個頭的負載平衡器:HTTP_X_FORWARDED_PROTO使用SSL在Load Balancer後重定向循環PHP

當它被設置到SSL返回「https」開頭,othwerise它總是返回「HTTP」

下面的代碼我以前用的將SSL證書之前的網站移至負載平衡器,而不是網站運行的網絡節點。 (HTTP_X_FORWARDED_PROTO)已被添加以相應地更新腳本。

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])){ 
    $redirect = ''; 
    if (!isset($sslPage)){ 
     $sslPage = false; 
    } 
    switch($_SERVER['HTTP_X_FORWARDED_PROTO']){ 
     case 'http' : 
      if ($sslPage) 
       $redirect = 'location: https://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 
      break; 

     case 'https' : 
      if (!$sslPage) 
       //$redirect = 'location: http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 
      break; 
    } 
    if (!empty($redirect)){ 
     header ($redirect); 
    } 
} 

需要打開ssl的每個頁面都有一個預加載的變量$ sslPage = true;

因此,從http重定向到https的工作很好..沒有問題。但是,如果我試圖倒退它不起作用。我陷入了一個無限循環。我開始認爲這是因爲apache。由於web節點不再終止SSL,所有通信都通過端口80運行。當php通過header()重定向時,我相信服務器會收集請求,因爲它是本地的並試圖解析它。由於HTTP_X_FORWARDED_PROTO從未更新,因爲它沒有再次觸及負載平衡器,所以重定向永遠不會成功。

我的問題是,如果這是有道理的,或者我對我的想法走錯了路?這個調用是否總是被轉發回負載均衡器?如果它保持在該網絡節點的內部,我該如何強制它返回到Load Balancer,以便它可以爲它嘗試檢索的頁面寫入新的標頭?

這已被證明是令人沮喪的....

感謝您的幫助提前。

+0

乍得,你找到了解決辦法嗎?我正在努力解決同樣的問題。 – 2012-06-08 02:41:09

回答

6

你可以只讓阿帕奇認爲 SSL是通過設置環境變量(在PHP邏輯$_SERVER['HTTPS']

SetEnvIf X-Forwarded-Proto https HTTPS=On 

這應該讓你的舊代碼,而無需改變工作。

+1

當您需要支持一堆不同的舊版應用程序並且不想通過更改檢查HTTPS的方式來中斷可升級性時,該功能非常適用。 +1 – justbeez 2012-08-15 00:06:10

2

我們剛剛遇到類似的事情,發現它是我們的Zeus負載均衡器干擾響應頭。 我們發現,如果初始請求是在https上完成的,並且返回到非安全頁面,則負載均衡器正在修改任何301/302發回的頭。

例如,如果客戶要求​​我們重定向到http://site.com以302,結果回客戶端將有「地點:​​」因爲負載平衡器已切換回(而不是預期的「 位置:http://site.com「)

這是通過在負載平衡器中關閉此功能來解決的。

希望可以幫助別人 - 這是一個討厭的問題,試圖達到底部!