2012-11-05 22 views
30

Có thể nhận các tiêu đề http của yêu cầu hiện tại bằng PHP không? Tôi là không phải là sử dụng Apache làm máy chủ web, nhưng sử dụng nginx.Nhận tiêu đề http từ yêu cầu hiện tại trong PHP

Tôi đã thử sử dụng getallheaders() nhưng tôi đang nhận được Call to undefined function getallheaders().

+0

như bạn có thể thấy trong câu trả lời của tôi bạn vẫn có thể sử dụng getallheaders() – gabrielem

+0

Go bỏ phiếu ở đây: https://bugs.php.net/bug.php?id = 62596 – Bell

Trả lời

3

Bạn có thể nâng cấp máy chủ lên PHP 5.4 do đó cấp cho bạn quyền truy cập vào getallheaders() qua fastcgi hoặc đơn giản phân tích cú pháp bạn cần $ _SERVER với vòng lặp foreach và một chút regex.

+1

'Nginx' có chạy trên FastCGI không? Đó có phải là lý do tại sao 'getallheaders()' không hoạt động dưới PHP 5.3? –

+1

@BenHarold Xem danh sách thay đổi của [getallheaders] (http://www.php.net/manual/en/function.getallheaders.php): _5.4: Chức năng này đã có sẵn dưới FastCGI. Trước đây, nó chỉ được hỗ trợ khi PHP được cài đặt như một mô-đun Apache._ –

+0

@FredWuerges Tôi đã đọc các thay đổi. Đó là lý do tại sao tôi hỏi những câu hỏi. Để từ nó tốt hơn một chút: Liệu nginx có luôn sử dụng FastCGI không, và đó là lý do tại sao 'getallheaders()' không hoạt động khi sử dụng PHP 5.3 hoặc cũ hơn với nginx? Điều này có nghĩa là cả hai 'getallheaders()' và 'apache_request_headers()' hoạt động khi sử dụng PHP 5.4 và nginx? –

43

Taken từ một người nào đó tài liệu đã viết một comment ...

if (!function_exists('getallheaders')) 
{ 
    function getallheaders() 
    { 
     $headers = array(); 
     foreach ($_SERVER as $name => $value) 
     { 
      if (substr($name, 0, 5) == 'HTTP_') 
      { 
       $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 
      } 
     } 
     return $headers; 
    } 
} 
+1

Cảm ơn nó hoạt động. Nhưng bạn có thể giải thích mục đích của 'ucwords' và' strtolower' trong hàm đó là gì? Có cần thiết không? – Cone

+1

Lỗi trong hàm này là các tiêu đề chữ hoa như "DNT" (Không theo dõi) sẽ trở thành "Dnt" - KHÔNG phải là trường hợp của getallheaders gốc() – Bell

20

Cải thiện @Layke chức năng của mình, làm cho nó an toàn hơn một chút để sử dụng nó:

if (!function_exists('getallheaders')) { 
    function getallheaders() 
    { 
     if (!is_array($_SERVER)) { 
      return array(); 
     } 

     $headers = array(); 
     foreach ($_SERVER as $name => $value) { 
      if (substr($name, 0, 5) == 'HTTP_') { 
       $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 
      } 
     } 
     return $headers; 
    } 
} 

(ước gì tôi có thể chỉ thêm điều này làm nhận xét cho câu trả lời của anh ấy nhưng vẫn xây dựng trên danh tiếng đó - một trong những câu trả lời đầu tiên của tôi)

1

Kết hợp nhận được allheaders() + apache_request_headers() cho nginx

function get_nginx_headers($function_name='getallheaders'){ 

     $all_headers=array(); 

     if(function_exists($function_name)){ 

      $all_headers=$function_name(); 
     } 
     else{ 

      foreach($_SERVER as $name => $value){ 

       if(substr($name,0,5)=='HTTP_'){ 

        $name=substr($name,5); 
        $name=str_replace('_',' ',$name); 
        $name=strtolower($name); 
        $name=ucwords($name); 
        $name=str_replace(' ', '-', $name); 

        $all_headers[$name] = $value; 
       } 
       elseif($function_name=='apache_request_headers'){ 

        $all_headers[$name] = $value; 
       } 
      } 
     } 


     return $all_headers; 
} 
Các vấn đề liên quan