Centos7

CentOS7安装Python3的方法CentOS7搭建L2TP服务端一键脚本CentOS7使用CertBot工具获取LetSencrypt泛域名HTTPS证书

Git

GIT删除仓库的历史提交记录脚本示例GIT进行代码量统计和贡献统计

HTTP

HTTP关于HEADER的详细解释HTTP协议对URI长度POST数据长度及COOKIE长度限制说明HTTP关于Code状态码的详细解释

JavaScript

JavaScript下的RSA对称加密DEMOJavaScript解析并遍历Excel示例代码JavaScript调用语音合成Speech Synthesis API使用ElementUI配合API数据快速渲染合并表格

Linux

Linux 信号说明列表说明Linux利用CronTab定时执行ThinkPHP命令行模式

MySQL

MySQL字符串截取MySQL腾讯云数据库导出备份到本地服务器导入MySQL设计与使用规范MySQL在5.7及以上版本中的ONLY_FULL_GROUP_BY问题处理方案

Nginx

Nginx反向代理NodeJS实现WSS协议Nginx反向代理中的Host参数传递遇到的坑Nginx配置HTTPS与HTTP2.0Nginx负载均衡的lnmp环境初始化脚本Nginx图片递归代理服务器DEMO

NodeJS

NodeJS一些冷门但实用的npm包NodeJS使用Request模块实现CURLNodeJS使用express模块无法收到phpCurl的值NodeJS使用jimp和qrcode-reader识别解析二维码NodeJS实现UDP数据报套接字通讯NodeJS实现Websocket聊天室NodeJS实现串口通讯简单例程NodeJS实现微信协议登录NodeJS实现超级方便的Git自动发布WebhookNodeJS控制台简单表格打印NodeJS转码amr到mp3NWJS配置文件

Other

C#串口通信扫码枪数据读取支付宝Schema协议列表默克尔树基础算法示例博客的升级历程

PHP

PHP下RSA对称加密超长字符串分段加密DEMOPHP下phpMyAdmin数据字典美化代码PHP下的RSA对称加解密-根证书自签与签发子证书PHP使用root权限执行系统命令和切换到www用户PHP使用独占文件指针实现阻塞少量并发PHP多进程同时处理任务示例DEMO代码PHP大文件视频上传WebUploaderPHP实现Web方式发起一个超时任务的处理请求PHP实现二叉查找树的简单代码实现PHP实现微博登录简单代码PHP微信JSSDK开发DEMOPHP的坑XML转JSONPHP简单实现QQ登录代码PHP获取URL HTTP_HOST和SERVER_NAMEPHP获取上周、本周、上月、本月、本季度、上季度时间方法PHP获取真实IP之IP代理-IP伪造-真实IPPHP解密微信小程序手机号简单DEMOPHP高精度计算常用代码

Python

Python3使用Pool进程池实现多进程并发Python3使用jieba分词并生成WordCloud词云图Python3使用request进行CURL操作Python3实现WebhookPython3使用Selenium进行自动化测试手册

Wechat

微信公众号php环境无法获取POST值微信公众号网页跳转避免出现导航栏的小技巧
Nginx反向代理中的Host参数传递遇到的坑
手机阅读

扫描二维码阅读文章

需求描述

有域名 a.comb.com , 其中 a.com域名为我方控制,b.com为对方控制,我方无权限操作b.com解析的服务器。

需要实现浏览器访问a.com域名时 , 地址栏依然显示 http://a.com , 但内容来源为b.com服务器提供,且部分内容需要进行替换处理。

挖坑思路

Nginx,这个不用说。 反向代理,这个也不用说,直接上demo:

server{
    listen 80;
    server_name a.com;
    location / {
        proxy_pass http://b.com/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host $host;
        proxy_set_header Connection "Upgrade";
        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;
    }
}

到此,本以为已经完成,在部分场景中上面的配置确实已经完成了需求。 但当b.com服务器中存在虚拟站点,且b.com不为该服务器默认站点时,以上的反向代理将反向代理到b.com所在的服务器的默认站点上。

填坑思路

我们知道,服务器中的虚拟站点的实际IP都是一个,开通虚拟站点有两种方式:

  1. 不同的域名访问 www.hamm.cn qr.hamm.cn
  2. 不同的端口访问 hamm.cn:80 hamm.cn:443 hamm.cn:8080

这两种思路分别对应Nginx中的server_name和listen字段,如:

反向代理中,我们使用了 proxy_set_header Host $host; 语句,将用户浏览器访问的域名a.com传递到了对方服务器。

但对方此时并没有为我们的a.com域名创建对应的虚拟站点,所以我们访问时会显示b.com服务器上的默认站点。

于是我们直接将$host变量改为固定的b.com,让b.com的虚拟站点以为来源域名确实是b.com

server{
    listen 80;
    server_name a.com;
    location / {
        proxy_pass http://b.com/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host "b.com"; #修改了这里
        proxy_set_header Connection "Upgrade";
        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;
    }
}

至此,这个坑填完了。

替换部分数据的坑

完成了反向代理,我们需要将b.com中的部分内容替换,如将 百度替换成谷歌,我们需要一个Nginx模块:subs_filter

编译安装过程略~

完整配置demo:

server{
    listen 80;
    server_name a.com;
    location / {
        proxy_pass http://b.com/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host "b.com"; #修改了这里
        proxy_set_header Connection "Upgrade";
        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;

        # 开始关键词替换
        subs_filter_types text/xml application/json text/html;
        subs_filter '百度' '谷歌';
    }
}

配置替换不生效的坑

如果配置完成后依然不生效,可能是gzip的锅,对方服务器进行了压缩,需要对方服务器关闭gzip或者在反代中添加

proxy_set_header Accept-Encoding "";

完结语

这是实际场景中碰到的一个坑,这里记录一下。 整体来说,踩坑的原因,还是对http网络请求中反向代理部分的理解不够透。 共勉。