问题描述: 在已备案的域名及服务器上,使用 Nginx 进行路径转发到另一阿里云服务器地址时,返回提示域名未备案的错误响应。
已备案的云服务器上nginx配置如下:
server { listen 443 ssl; server_name api.com.XXX.cn; access_log logs/api.com.log main; # ssl_certificate /path/to/your/certificate.pem; # ssl_certificate_key /path/to/your/private.key; ssl_certificate /usr/local/nginx/conf.d/api.com_nginx/api.com.ngbor.cn_bundle.crt; ssl_certificate_key /usr/local/nginx/conf.d/api.com_nginx/api.com.ngbor.cn.key; ssl_session_timeout 5m; #请按照以下协议配置 ssl_protocols TLSv1.2 TLSv1.3; #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location /stag/ { proxy_pass http://xxx.108.194.6:18xx/; 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; } } |
其中的服务器域名api.com.XXX.cn是已经备案且能正常访问的。
转发的地址为:http://xxx.108.194.6:18xx,单独以http://xxx.108.194.6:18xx访问转发的服务器也能正常访问返回响应数据。
错误现象:以https://api.com.XXX.cn/stag为地址转发访问时会返回一段错误提示:
<html> <head> <meta http-equiv="Content-Type" content="textml;charset=UTF-8" /> <style>body{background-color:#FFFFFF}</style> <title>Non-compliance ICP Filing</title> <script language="javascript" type="text/javascript"> window.onload = function () { document.getElementById("mainFrame").src= "http://batit.aliyun.com/alww.html?id=00000000004369016636"; } </script> </head> <body> <iframe style="width:860px; height:500px;position:absolute;margin-left:-430px;margin-top:-250px;top:50%;left:50%;" id="mainFrame" src="" frameborder="0" scrolling="no"></iframe> </body> </html> |
在浏览器中输入提示中的地址链接:http://batit.aliyun.com/alww.html?id=00000000004369016636
返回如下页面:
提未网站未备案。
问题原因
proxy_set_header Host $Host:$server_port;
这一行的作用是将原 HTTP 请求中的 Host 字段也转发到目标服务器。在这个情况下,Host 字段值为我们自己域名而不是 xxx.108.194.6:18xx,所以阿里云服务器查 Host 头时发现了不匹配的情况,因而拒绝了请求。
解决方案
为了解决这个问题,我们需要调整 Nginx 配置,移除导致备案检查失败的 Host 头设置。以下是修改后的配置:
location /stag/ { proxy_pass http://xxx.108.194.6:18xx/; # 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; } |
通过删除 proxy_set_header Host $host,避免了将原始的 Host 头转发到目标服务器,从而避免了备案问题的干扰。
总结
在进行 Nginx 配置时,了解每一个指令的作用是非常重要的。特别是 proxy_set_header 指令,它直接影响到请求头的转发方式。如果遇到类似的问题,一定要详细检查配置,确保转发的请求头符合目标服务器的要求。
一定要多了解 Nginx 配置,掌握其细节,这样可以更好地解决各种问题,确保服务的正常运行。
评论前必须登录!
注册