我们有个项目,前端调用了第三方接口。为了避免跨域,所以使用nginx进行转发。一直正常工作,相安无事。近日第三方调整了安全策略,http转换成https,原本使用ip,现在也改成使用域名,所以nginx这里我们也需要改一下。结果改了以后,报404。

nginx的相关配置如下:

location /other3/ {
		proxy_pass https://gh.abc.com/3-18035/;
		proxy_set_header   X-Forwarded-Proto $scheme;
		proxy_set_header   Host              $http_host;
		proxy_set_header   X-Real-IP         $remote_addr;
		proxy_read_timeout 180;
}

我再三拷问AI,它说了几次废话后,说有可能是Host头部的原因:
默认情况下,Nginx 会将客户端请求的 Host 头部(即客户端本身的地址,例如 10.26.40.24:9988)转发给后端服务器。
如果后端服务器对 Host 头部有严格要求(例如必须是 gh.abc.com),则需要显式设置 Host 为后端服务器的域名。

于是再次修改,问题解决:

location /other3/ {
		proxy_pass https://gh.abc.com/3-18035/;
   		proxy_set_header   X-Forwarded-Proto $scheme;
   		#proxy_set_header   Host              $http_host;
		proxy_set_header   Host              gh.abc.com;  # 修改这里
   		proxy_set_header   X-Real-IP         $remote_addr;
   		proxy_read_timeout 180;
}

主要是nginx的配置代码,都是抄过来的,东抄西抄,不知道具体含义。请教AI,它给出的含义是:

# 匹配所有以 "/other3/" 开头的请求
location /other3/ {
    # 将匹配到的请求转发到 https://gh.abc.com/3-18035/
    proxy_pass https://gh.abc.com/3-18035/;
    
    # 设置 "X-Forwarded-Proto" 请求头为客户端请求的协议(HTTP 或 HTTPS)
    # 即将客户端请求的协议类型(HTTP 或 HTTPS)传递给后端服务器
    # 比如我的客户端是http,则以http向目标服务器请求,尽管目标服务器是是https;
    # 如果目标服务器只认https,那只能是这样设置:proxy_set_header X-Forwarded-Proto https;
    proxy_set_header   X-Forwarded-Proto $scheme;

	# 将 Host 头设置为客户端请求中原始的 Host 头部值
	# proxy_set_header   Host              $http_host;
	
    # 显式设置 "Host" 请求头为 "gh.abc.com"
    proxy_set_header   Host              gh.abc.com;  

    # 设置 "X-Real-IP" 请求头为客户端的真实 IP 地址
    proxy_set_header   X-Real-IP         $remote_addr;

    # 设置 Nginx 等待后端服务器响应的超时时间为 180 秒
    proxy_read_timeout 180;
}

学习了。