51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

在对接CDN后Nginx传递Host到php时异常

在访问博客时,发现授权异常,查看到端口非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;
        }
赞(0)
未经允许不得转载:工具盒子 » 在对接CDN后Nginx传递Host到php时异常