在访问博客时,发现授权异常,查看到端口非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_header
和 fastcgi_param
是针对不同模块的指令:
- proxy_set_header:用于设置传递给 HTTP 代理后端(如通过
proxy_pass
指令)的请求头。这个指令在 Nginx 作为 HTTP 反向代理时使用。 - 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;
}