2015-09-16 29 views
0

我只是實現的OAuth我的服務器上。 爲了驗證我需要通過標記爲一"Header"關鍵"Authorization"訪問客戶端發送了頭後面的負載平衡器

這個偉大的工程在當地,但是當我因爲系統的背後是豆莖負載平衡器此代碼部署到我的生產服務器,我沒有得到我的個人EC2實例任何接頭PHP運行時。

   +---------------+  +----------------+ 
      |    |  |    | 
+----------> | Load Balancer+---> | EC2 Server | 
      |    |  |    | 
      |    |  |    | 
      +----------+----+  +----------------+ 
         |        
         |   +-----------------+ 
         |   |     | 
         |   | EC2 Server | 
         +--------> |     | 
            |     | 
            +-----------------+ 

我本來與客戶端IP相同的問題,在服務器會給我後面的負載平衡器IP爲$_SERVER['REMOTE_ADDR']。我通過這樣做修復了

if (getenv('HTTP_X_FORWARDED_FOR')) { 
    $ip_array = explode(",", getenv('HTTP_X_FORWARDED_FOR')); 
    $_SERVER['REMOTE_ADDR'] = trim($ip_array[0]); 
} 

在我的index.php上,我試着做die(var_dump($_SERVER))。 但我看不到任何我發送的標題。

我看到HTTP_X_FORWARDED_FORHTTP_X_FORWARDED_PORTHTTP_X_FORWARDED_PROTO但沒有涉及頭。

怎樣才能讓我的個人服務器上的頭部穿​​過了豆莖負載平衡器後?

+1

'getallheaders()'怎麼樣? http://php.net/manual/en/function.getallheaders.php –

+0

啊,這真的有效!這麼奇怪 – user391986

回答

1

的東西在$_[SERVER]返回顯然包括頭和它們的值的一些一個副本,其中HTTP_上漲了到前,破折號改爲下劃線,並且鑰匙強制爲全大寫(在電線頭實際上並不區分大小寫,但是當你處理一個關聯數組時,你需要一個規範形式的關鍵字)......它可能都是以這種方式完成的,因爲一個很好的傳統理由是幾乎沒有人記得更多。

真正的請求頭是通過getallheaders()功能來訪問,至少如果你使用的是Apache Web服務器。