游客发表
打开浏览器,网站输入 A 网站的代理域名,屏幕上显示的访问却是 B 网站的内容。地址栏没变,个网页面却换了张脸。网站这就是代理网站代理访问另一个网址最直白的效果。干这事的访问不是浏览器插件,也不是个网什么黑客手段,而是网站一段跑在服务器上的转发逻辑。
我最早接触这个,代理是访问因为公司内网有个老系统,只允许特定 IP 访问。个网在家办公时根本连不上。网站后来运维同事丢给我一个地址,代理说“走代理”。访问我点进去,界面跟内网一模一样,但域名是外网的。当时觉得挺神奇,拆开看原理,其实就一句话:代理服务器替你发了请求,又把结果原样搬回来。
假设你访问 proxy.example.com,这个服务器上跑着一段代码。它收到你的请求后,并不是返回自己站点上的页面,而是转身向 target.com 发起一个新的 HTTP 请求。拿到 target 的响应后,再把 HTML、CSS、JS 这些内容塞回给你。你的浏览器以为自己在跟 proxy.example.com 对话,实际上所有实质内容都来自 target.com。
这跟反向代理不同。反向代理通常代理的是自己家的多个后端服务,用户并不清楚背后有几台机器。而这里说的“代理访问另一个网址”,目标往往是外部站点,代理服务器更像一个中间人,把别人的东西端到你面前。
Nginx 做这件事只需要几行配置:
location / { proxy_pass https://target.com; proxy_set_header Host target.com; } 就这么简单。浏览器请求 proxy.example.com,Nginx 把请求转给 target.com,再把响应吐回来。地址栏不变,内容全换。
需求五花八门。有人是为了绕过网络限制。比如某些资源站被墙了,找个没被墙的代理服务器中转一下。有人是为了隐藏真实来源。爬虫工程师最熟悉这套,拿一批代理 IP 轮着用,目标网站看到的全是代理服务器的地址,封不过来。
还有一类场景跟安全有关。比如公司不想让员工直接访问外部某个系统,就在中间加一层代理,所有流量过一遍审计。谁在什么时候访问了什么,代理服务器上都有日志。员工以为自己直连了目标,其实每一步都被记录在案。
我见过一个比较取巧的用法:前端开发时后端接口还没写好,直接用代理把请求转发到测试环境。本地跑 localhost:3000,API 请求走代理到 test.api.com,跨域问题也顺带解决了。webpack 的 devServer.proxy 就是这个思路。
代理访问另一个网址,最头疼的是相对路径。target.com 的页面里写了个 <img src=“/logo.png”>,浏览器会去 proxy.example.com/logo.png 找这张图。代理服务器如果没做处理,这个请求就 404 了。解决办法要么是让代理把所有路径都转发过去,要么是在返回的 HTML 里把相对路径改写成绝对路径。前者简单但容易把代理服务器自己站点的资源也搅进去,后者干净但实现麻烦。
Cookie 和域名也是麻烦事。target.com 设了个 Cookie,Domain 写的是 .target.com。浏览器一看,当前域名是 proxy.example.com,这个 Cookie 存不下来。登录状态就丢了。有些代理会重写 Set-Cookie 头,把 Domain 改成代理服务器的域名,但改完之后 target 那边的会话校验又可能出问题。来回折腾,最后往往得靠 URL 重写或者干脆放弃 Cookie,改用 Token。
HTTPS 更复杂。如果 target.com 是 HTTPS,代理服务器得能跟它建立 TLS 连接。代理自己对外是 HTTP 还是 HTTPS,又是另一回事。如果代理对外也是 HTTPS,浏览器会检查证书域名是否匹配 proxy.example.com。证书没问题,但页面里如果混了 target.com 的绝对地址资源,浏览器又会因为跨域或者混合内容拦下来。控制台一片红。
拿 Nginx 举例,装好之后改配置文件,加一个 server 块,listen 80,server_name 填你的代理域名。location / 里写 proxy_pass 指向目标网址。reload 一下,浏览器访问代理域名,应该就能看到目标站点的首页了。图片挂掉、样式错乱是正常的,因为路径没处理。想省事可以用 sub_filter 模块做文本替换,把目标域名替换成代理域名。但 sub_filter 对 JS 里动态拼接的 URL 无能为力,该挂的还是挂。
更省心的方案是用现成的代理程序,比如 proxy.py 或者 mitmproxy。它们帮你处理了大部分路径重写和头部转发的问题。但性能上不如 Nginx 直接转发来得干脆。选哪个,看你是想快速验证还是长期跑。
代理访问另一个网址,本质就是一次请求的接力。理解了这个,配置起来就不容易迷糊。至于那些路径、Cookie、证书的坑,踩过一次就记住了。
友情链接