我在项目配置的时候遇到一个问题:
配置了域名转发,且配置了https
nginx配置如下:
bash
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
location / {
proxy_pass http://backend_ip_address;
}
}
浏览器访问的时候通过https://yourdomain.com/admin (静态文件的转发配置没有贴)
静态文件是可以读到的,但是在访问登录接口的时候出现问题了,看了下请求信息发现:
1、通过域名访问后,登录接口的请求的地址显示为后端登录接口服务器的IP地址
2、接口请求变成了http请求。
以上两个原因造成我的服务异常。
最终解决的方法:
再转发的时候没有保留原始的主机名传递给后端服务器
bash
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://backend_ip_address;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
总结下排查步骤:
1、检查 Nginx 配置:确保 server_name 配置正确,并且 proxy_set_header Host $host; 配置已包含。
2、检查后端服务:确认后端服务在返回重定向或生成 URL 时使用了正确的域名。
3、查看浏览器开发者工具:使用浏览器的开发者工具查看网络请求,检查重定向是否来自后端服务或 Nginx,并查看响应头中的 Location 字段
但是有个问题,同样的架构,我有一个其他的项目,location配置的时候只配置了proxy_pass,没有出现问题,先记录一下吧。