在访问博客时,发现授权异常,查看到端口非443,而是8443。
通过复现,发现是由于CF的CDN节点存在8443端口,在访问8443端口时会携带Host为lolicp.com:8443的内容,被后端PHP程序识别异常。

问题排查

php获取请求

通过PHP查看后端接收到的Host和Post内容。

<?php
header('Content-Type: application/json');

// 获取 Host
$host = $_SERVER['HTTP_HOST'];

// 获取端口
$port = isset($_SERVER['HTTP_X_FORWARDED_PORT']) ? $_SERVER['HTTP_X_FORWARDED_PORT'] : ($_SERVER['SERVER_PORT'] ?? '80');

// 将 Host 和端口添加到返回的请求头信息中
$headers = [
    'Host' => $host,
    'Port' => $port
];

// 返回 JSON 格式的请求头
echo json_encode($headers, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>

通过访问https://lolicp.com:8443/地址,测试发现后端输出

{
    "Host": "lolicp.com:8443",
    "Port": "443"
}
nginx配置查看

通过查看nginx配置,发现已经设置了header Host,但不知为何没有传递到php中。

location ~ [^/]\.php(/|$) {
            root           /lolicp/lolicp.com;
            fastcgi_pass webserver;
            fastcgi_index  index.php;
            include        fastcgi.conf;
            proxy_set_header Host lolicp.com;
        }

问题解决

通过查阅相关资料,发现 proxy_set_headerfastcgi_param 是针对不同模块的指令:

  1. proxy_set_header:用于设置传递给 HTTP 代理后端(如通过 proxy_pass 指令)的请求头。这个指令在 Nginx 作为 HTTP 反向代理时使用。
  2. fastcgi_param​:用于设置传递给 FastCGI 后端(如通过 fastcgi_pass 指令)的参数。这个指令在 Nginx 作为 FastCGI 代理时使用。

而后端php使用的是fastcgi,故需要使用fastcgi_param指令用于在存在端口时指定域名。

配置

在nginx对应配置中添加fastcgi_param 的配置,指定域名及端口。

location ~ [^/]\.php(/|$) {
            root           /wwwroot/blog_Typecho;
            fastcgi_pass WebStie_php_Server;
            fastcgi_index  index.php;
            include        fastcgi.conf;
            fastcgi_param  HTTP_HOST lolicp.com;
        }
END

本文标题:在对接CDN后Nginx传递Host到php时异常

本文作者:宇宙最帅的男人

本文链接:https://lolicp.com/nginx/202402676.html

版权声明:转载或者引用本文内容请注明来源及原作者,本文著作权归作者 (宇宙最帅的男人) 所有。

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

最后修改:2024 年 06 月 02 日
如果觉得我的文章对你有用,请随意赞赏