注意:TP5 获取header自动转小写问题

官方文档:

HTTP请求头信息的名称不区分大小写,并且 _ 会自动转换为 - ,所以下面的写法都是等效的:

$agent = Request::instance()->header('user-agent');
$agent = Request::instance()->header('User-Agent');
$agent = Request::instance()->header('USER_AGENT');

注意:
如果不传具体的key ,则会把所有的header都转为小写,比如下面这样:

// 假如header中的某个key 是:USER_AGENT
$headers = Request::instance()->header();
// 那么这时候通过headers数组获取某个header 就需要用小写和中划线了
$agent = $headers['user-agent'] 

TP5源码:

/**
     * 设置或者获取当前的Header
     * @access public
     * @param string|array $name    header名称
     * @param string       $default 默认值
     * @return string
     */
    public function header($name = '', $default = null)
    {
        if (empty($this->header)) {
            $header = [];
            if (function_exists('apache_request_headers') && $result = apache_request_headers()) {
                $header = $result;
            } else {
                $server = $this->server ?: $_SERVER;
                foreach ($server as $key => $val) {
                    if (0 === strpos($key, 'HTTP_')) {
                        $key          = str_replace('_', '-', strtolower(substr($key, 5)));
                        $header[$key] = $val;
                    }
                }
                if (isset($server['CONTENT_TYPE'])) {
                    $header['content-type'] = $server['CONTENT_TYPE'];
                }
                if (isset($server['CONTENT_LENGTH'])) {
                    $header['content-length'] = $server['CONTENT_LENGTH'];
                }
            }
            // 转小写
            $this->header = array_change_key_case($header);
        }
        if (is_array($name)) {
            return $this->header = array_merge($this->header, $name);
        }
        if ('' === $name) {
            return $this->header;
        }
        // 转小写 替换下划线
        $name = str_replace('_', '-', strtolower($name));
        return isset($this->header[$name]) ? $this->header[$name] : $default;
    }

题外话:
如果在header中传输的key 包含了下划线,那么服务器是Nginx的情况就需要注意了:

Nginx对header name的字符做了限制,默认 underscores_in_headers 为off,表示如果header name中包含下划线,则忽略掉,部署后就获取不到。

解决方案:

1.在header里不要用 “_” 下划线,可以用驼峰命名或者其他的符号(如- 中划线)代替。
2.在nginx里的 nginx.conf文件中配置http的部分添加 : underscores_in_headers on;(默认值是off)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值