Loading... ## 前言 本来今天在折腾百度收录本站的事,奈何百度不支持 eu.org 作为顶级域名(还是 Google 好啊~),刚好手里有个 xyz 的数字域名。 打算反代 xyz 到 eu.org,本站使用的是 typecho 框架,handsome 主题。 ## 实践 我尝试过: 1. 配置 Host 头为 $host ```nginx proxy_pass https://www.guohao.eu.org; proxy_set_header Host $host; ``` 这样做会导致 nginx 死循环。 因为我的 xyz 和 eu.org 都是部署在一个 nginx 上。 如果浏览器访问 xyz,nginx 再去连接 proxy_pass 指定的地址其实还是访问的自己。 而且 $host 完全没变,这就是一直在访问 xyz 自己,nginx 不停的连接自己。 在我的浏览器表现中,出现了 【Request Header Or Cookie Too Large】。 2. 配置 Host 头为 www.guohao.eu.org ```nginx proxy_pass https://www.guohao.eu.org; proxy_set_header Host www.guohao.eu.org; ``` 这样做虽然能够正常打开页面,但是 typecho 后台接收到的还是 eu.org ,而不是 xyz,使得 typecho 和 handsome 在解析和输出相关 url 的时候是错误的,不能使用上 xyz 域名。 虽然我想过反代的时候传递一个自定义 http header 到 eu.org。 但一番操作下来,发现既要改源码,还受限于 typecho 的后台编辑的【站点地址】,遂放弃。 3. 我还尝试过修改 proxy_pass 为 http://127.0.0.1,然而其实这种修改很傻。 PS:虽然可以不用反代,xyz 和 eu.org 都指向同一份代码,但是【站点地址】应该是存在数据库中的,还有就是需要 handsome 授权多个域名,弄起来太麻烦了。 ## 思考 虽然工作了很多年了,但一直未能搞清楚 http 服务器是如何区分识别客户端访问的主机的,我曾以为会和 proxy_pass 有关系,但是今天的实践下来,特别是看了一下 Typecho 源码之后,恍然大悟。 1. 作为客户端的一方,无论是浏览器 还是 这里反代的 Nginx。在发起连接的时候,连接的域名对于 http 服务器来说是毫不知情的,域名只对客户端有用,解析域名获得 IP 之后客户端是直接 TCP 连接到Server。 2. 客户端真正想访问的域名是通过 TCP 连接之后发送过去的数据告知 Server 的,就是通过请求头中的 Host 字段。 最后修改:2024 年 09 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏