PHP 要讀取外部自訂送進來得 HTTP Header,要怎麼做呢?
PHP 讀取客製化傳送進來的 HTTP Header
假設客製化的 HTTP Header 是下述:
- X-Test-Data: Test-123
於 Apache 的環境很簡單,只要使用 apache_request_header(): Fetch all HTTP request headers 即可,如下述範例:
- vim header.php
<?php print_r(apache_request_headers()); // 印出所有 Header echo apache_request_headers()['X-Test-Data']; ?>
- curl -H 'X-Test-Data: Test-123' http://example.com/header.php # 就是我們要的值 Test-123
- 但是上述函式庫只有支援 Apache Module,若於 CLI 或 Fastcgi mode 就會有問題,如下述:
- php header.php
PHP Fatal error: Uncaught Error: Call to undefined function apache_request_headers() in /var/www/header.php:2
想用 $_SERVER 直接取得自行定義的 Header 值,要怎麼做呢?
- $_SERVER 自訂 Header 變數,有下述幾個自動轉換(純粹我自己測試觀察):
- 自訂 Header 變數,變數名字中間只能用 "-" 分隔 (不可用 "_"、" ")
- "-" 自動轉變成 "_"
- 小寫 自動轉變成 大寫
- 依照上面規則,寫了下述 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'); ?>
- 若有 apache_request_headers() 的話,用 apache_request_headers() 可以抓到比較多的值 (變數有 _ 都可以吃到),沒有的話,就自己轉換由 $_SERVER 抓取。
- 驗證 curl -H 'X-Test-Data: Test-123' http://example.com/header.php # 就是我們要的值 Test-123