如何在 Chrome 中只让特定网站走代理
目录

简而言之: 桌面版 Chrome 没有把代理只应用于特定网站的设置。它对所有浏览只运行一套代理配置,这套配置来自操作系统、启动参数、管理员策略或扩展程序。要只让部分网站走代理,Chrome 需要一个 PAC 脚本:一个为每次请求选择代理的简短函数,可以由您自己编写,也可以由扩展程序根据规则生成。
要在 Chrome 中只让特定网站走代理,就要给浏览器一个列出这些网站的 PAC 脚本,Chrome 会在每次请求时参照它。脚本可以来自三个地方:您的操作系统、一个单独启动的 Chrome,或者一个扩展程序。
Chrome 有按网站设置代理的选项吗?
没有。Chrome 的设置页面只有一个代理入口,标为“打开您计算机的代理设置”,而 Chromium 把这些设置描述为适用于整台电脑(Chromium 的设置字符串)。
Chromium 的代理说明列出了 Chrome 可以获取代理配置的四个来源:管理员策略、命令行参数、扩展程序和操作系统。无论哪一个生效,它都为浏览器加载的一切提供同一套配置,而按网站做出的决定,以 PAC 脚本的形式存在于这套配置之中。
PAC 脚本是做什么的?
PAC(代理自动配置)脚本是一个名为 FindProxyForURL 的 JavaScript 函数。Chrome 在每次请求时用地址和主机名调用它,并使用它返回的字符串:DIRECT 表示不使用代理,PROXY host:port 表示使用某个代理服务器,详见 MDN 的 PAC 参考。
下面这个脚本让一个域名及其子域名走代理,其余一切直连。代理地址取自专供文档使用的地址段(RFC 5737),请换成您自己的地址。
function FindProxyForURL(url, host) {
if (host === "example.com" || dnsDomainIs(host, ".example.com")) {
return "PROXY 203.0.113.10:8080";
}
return "DIRECT";
}
每个要走代理的网站各加一个条件。最后的 return 决定所有未列出的网站如何处理。
有哪些方法可以把 PAC 脚本交给 Chrome?
有三种:通过系统代理设置、通过一个单独启动的 Chrome,或者通过扩展程序。它们的区别在于会影响电脑上的多大范围,以及修改如何生效。
通过系统代理设置
在 Windows 上,代理设置中有一个“设置脚本”选项,可以填入脚本的地址,见 Microsoft 的指南,而 Chrome 会遵循系统设置。脚本必须能通过一个网址访问到。所有读取系统代理设置的应用程序也都会使用它,所以这种方法适合打算让整台电脑使用的脚本。
在单独的 Chrome 实例中
Chrome 在启动时接受代理参数,这些参数列在 Chromium 的网络设置页面上:--proxy-server 指定一个代理,--proxy-bypass-list 列出不走代理的主机,--proxy-pac-url 指向一个脚本。使用自己的 --user-data-dir 启动后,第二个 Chrome 会与您平时用的那个并行运行,因为两个正在运行的实例不能共用一个数据目录(Chromium 关于用户数据目录的说明)。
google-chrome --user-data-dir="$HOME/chrome-proxied" --proxy-server="http://203.0.113.10:8080"
这个实例的所有流量都走代理,所以您在哪个窗口中打开网站,就决定了它走哪条路由。要更换代理,就得退出这个实例,再用新的参数重新启动。
使用代理扩展程序
扩展程序通过 chrome.proxy API 为其所在的配置文件设置 Chrome 的代理,而带规则的切换器会把规则编译成 PAC 脚本。我们免费的 ProxyJam Connector 就是这样工作的,在 Chrome 和 Microsoft Edge 中都可以使用:
- 添加一个配置,填入代理的主机、端口和协议。
- 添加一条规则,例如对
example.com使用“Domain + subdomains”(域名及子域名),并指向这个配置。第一条匹配网站的规则生效。 - 把回退(fallback)保持为 Direct(直连),这样不匹配任何规则的网站会不经代理直接连接。
- 在工具栏弹出窗口中选择 Auto(自动)。
对于匹配的网站,Connector 的脚本只指定这一个代理,后面不附带直连选项。如果代理不可用,该网站就无法加载,而您自己的地址永远不会被用来访问它。
每个标签页能使用不同的代理吗?
在 Chrome 中不能。chrome.proxy API 为一个配置文件只存储一个值,也不接受标签页作为参数,所以标签页没有可以单独设置的东西。
可行的单位是配置文件或实例。为需要走代理的工作新建第二个 Chrome 配置文件并在其中安装扩展程序,或者用单独的参数启动第二个实例,然后把两个窗口并排放置。这样每个窗口就各自带着自己的代理。
为什么带路径的规则在 HTTPS 网站上失效?
对于 https:// 地址,Chrome 只把协议、主机和端口交给 PAC 脚本。自 Chrome 52 起,路径、查询参数和片段都会被去掉,而关闭这一行为的选项已在 Chrome 75 中移除(Chromium 的代理说明)。
因此,像 example.com/shop/* 这样的规则不会匹配任何 HTTPS 页面。请按主机名编写规则;如果网站的某个部分需要单独的路由,就给它一个独立的子域名。普通的 http:// 地址仍会连同路径一起传给脚本,但 Chromium 建议不要依赖这一点。Connector 会在任何依赖路径的规则旁边显示警告。
应该选择哪种方法?
如果只有几个网站和一个代理,扩展程序最省事,扩展程序页面列出了 Connector 在 Chrome 上能做和不能做的事。需要密码的代理见为什么 Chrome 一再要求输入代理用户名和密码,从旧的切换器迁移规则见 Manifest V3 带来了哪些变化。如何为每个国家设置一个配置文件和代理,以查看您自己的网站在各个市场的样子,见从另一个国家查看您的网站。
如果您希望让这些网站所走的代理保持一个注册在互联网服务商名下的地址,那就是 ISP 代理。ProxyJam 在 ISP 代理页面上销售静态住宅(ISP)代理,价格见价格页面。
