缘起
2020年的时候,感觉家里的路由实在是太慢了,正好360新出的360WiFi6全屋路由 天穹 V6 路由感觉还蛮不错,就入手了。
使用至今整体还算稳定,功能也能满足大部分使用场景,而且系统自带「自定义hosts」功能,在内网想要使用域名访问部署的服务也就方便多了,虽说不支持泛域名解析,一个一个配有些繁琐,但好歹也省去另外部署DNS的繁琐操作了。
只是官方自带的 app 在功能上有不少阉割,像「功能扩展」下的大部分功能就只能通过PC 网页端访问。今年618屯了台配置还不错的迷你主机,准备放在家里长期开机做内网开发服务器用。当然作为一个程序员长期开机的机器,内网穿透肯定是要部署的。
上下求索
所有准备工作就绪后,想着方便随时配置路由,便把路由通过内网穿透在外网可以随时远程访问。配置好FRP
和nginx
代理后,登录页面可以正常访问,但是登录后,跳转到主界面,闪一下便又回到登录界面了。问题既然出了,先看看有没有碰到同样问题的小伙伴。
便通过360路由官方的社区链接,看看有没有用户反馈相同的问题,于是找到下面这几个反馈同类问题的帖子:
看了一圈,始终没有一个能解决问题的答复,而且看一些标注为「产品答疑师」的回复都不能解决实际反馈的问题,看来是时候施展混迹IT圈多年所学的三脚猫功夫啦。毕竟原理上都是HTTP访问,浏览器发起的HTTP请求只要跟内网请求头信息一致,理论上都是可行的。
开始折腾
于是通过nginx 代理的地址,真发现如下问题:
登录后,发起了「GET /router/get_router_device_capability.cgi」ajax 请求,但是,该接口响应的是302
,又重定向到/login.htm
登录页面。初步以为是后端对 Host 或 Referer这些头信息做了校验,遂配置nginx相关头信息:
proxy_set_header Host http://192.168.0.1;
proxy_set_header Referer http://192.168.0.1/login_pc.htm;
重启 nginx 再次访问,发现问题依旧。进一步发现请求头中有一个token_id
的头信息,值为 undefined
,根据 token_id
字符串搜了下网页代码,发现从url获取参数存在问题:
该导致了请求的时候根本没获取到用户认证所需的 token_id
,导致请求失败。进一步深挖,发现头信息中的 Cookie 是存在 token_id 的:
这样的话,是不是可以考虑nginx
代理的时候,从Cookie
中获取token_id
然后设置一个 名为token_id
的头请求后端呢?说干就干,一翻摸索后,在nginx
配置信息中加入如下信息:
set $TOKEN_ID "";
if ($http_cookie ~* "token_id=(.+?)(?=;|$)") {
set $TOKEN_ID "$1";
}
proxy_set_header token_id "$TOKEN_ID";
完整nginx
虚拟主机配置信息如下:
server {
listen 80;
server_name router.home.zhuzhilong.cn;
location / {
proxy_set_header Referer http://192.168.0.1/login_pc.htm;
proxy_pass http://192.168.0.1;
set $TOKEN_ID "";
if ($http_cookie ~* "token_id=(.+?)(?=;|$)") {
set $TOKEN_ID "$1";
}
proxy_set_header token_id "$TOKEN_ID";
}
}
重启路由器,验证成功!!
圆满收场
最终实现后的效果录屏如下:
评论 (0)