PHP 讀取客製化傳送進來的 HTTP Header

PHP 要讀取外部自訂送進來得 HTTP Header,要怎麼做呢?

PHP 讀取客製化傳送進來的 HTTP Header

假設客製化的 HTTP Header 是下述:

  • X-Test-Data: Test-123

於 Apache 的環境很簡單,只要使用 apache_request_header(): Fetch all HTTP request headers 即可,如下述範例:

  1. vim header.php
    <?php
    print_r(apache_request_headers()); // 印出所有 Header
    echo apache_request_headers()['X-Test-Data'];
    ?>
  2. curl -H 'X-Test-Data: Test-123' http://example.com/header.php # 就是我們要的值 Test-123
  3. 但是上述函式庫只有支援 Apache Module,若於 CLI 或 Fastcgi mode 就會有問題,如下述:
  4. php header.php

    PHP Fatal error: Uncaught Error: Call to undefined function apache_request_headers() in /var/www/header.php:2

想用 $_SERVER 直接取得自行定義的 Header 值,要怎麼做呢?

  1. $_SERVER 自訂 Header 變數,有下述幾個自動轉換(純粹我自己測試觀察):
    • 自訂 Header 變數,變數名字中間只能用 "-" 分隔 (不可用 "_"、" ")
    • "-" 自動轉變成 "_"
    • 小寫 自動轉變成 大寫
  2. 依照上面規則,寫了下述 Function 來做取值轉換:
    <?php
    function get_header_var($name)
    {
        if (function_exists('apache_request_headers')) {                                                                                                                                                            
            return isset(apache_request_headers()[$name]) ? apache_request_headers()[$name] : '';                                                                                                                                                   
        }                                                                                                                                                                                                       
    
        $name = 'HTTP_' . strtoupper(strreplace('-', '_', $name));
    
        return isset($_SERVER[$name]) ? $_SERVER[$name] : '';
    }
    echo getheader_var('X-Test-Data');
    ?>
  3. 若有 apache_request_headers() 的話,用 apache_request_headers() 可以抓到比較多的值 (變數有 _ 都可以吃到),沒有的話,就自己轉換由 $_SERVER 抓取。
  4. 驗證 curl -H 'X-Test-Data: Test-123' http://example.com/header.php # 就是我們要的值 Test-123

關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming 並標籤為 , , , , , , 。將永久鏈結加入書籤。

發表迴響