Linux宝塔Nginx配置问题

2024-08 1

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    add_header X-Cache $upstream_cache_status;
    proxy_set_header X-Host $host:$server_port;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 30s;
    proxy_read_timeout 86400s;
    proxy_send_timeout 30s;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

上述是宝塔网站开启外网映射后ng的主要配置。这里有一个问题,外网映射的时候如果是HTTP请求,那么就是对应的80端口,如果是HTTPS请求,那么对应的就是443端口。
在第3行配置里proxy_set_header Host $host:$server_port;,如果我们的请求是https://www.demo.com那么这行配置会将请求头中的 Host 设置为 $host 和 $server_port 的组合。具体来说:

  • $host: 这个变量的值是请求中的 Host 头部字段的值,也就是www.demo.com
  • $server_port: 这个变量的值是 NGINX 配置的监听端口。例如,默认的 HTTPS 端口是 443。

默认的http请求头Host字段中,其组成格式是主机 + 端口号,其中如果端口号是默认的,比如http是80,https是443,那么Host字段就不包含端口号。
而第3行的配置里加回了端口号,这样就会使得我们请求到服务器的Host变成www.demo.com:443
同时,另一个字段Origin也由于是使用的默认端口号,并没有包含端口号,所以该字段是https:www.demo.com
因此,用默认端口号的时候,原先Host头和Origin头都不会包含端口信息,而第3行的配置里,给Host显示配上了端口号,因此就有可能导致服务器报下面这个错误:

`x-forwarded-host` header with value `www.huangwd.com:443` does not match `origin` header with value `www.huangwd.com` from a forwarded Server Actions request. Aborting the action.

解决方式也很简单,调整第3行配置,去掉端口号配置就行:

proxy_set_header Host $host; // 去掉了端口号
  • Nginx