我是靠谱客的博主 朴实薯片,最近开发中收集的这篇文章主要介绍注意: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)

最后

以上就是朴实薯片为你收集整理的注意:TP5 获取header自动转小写问题的全部内容,希望文章能够帮你解决注意:TP5 获取header自动转小写问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部