You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTTPS请求中主机名替换为IP地址的实现方案咨询

问题解答:HTTPS下IP替换的正确实现与实践建议

问题核心原因

直接用IP替代域名访问HTTPS站点时,会触发两个关键问题:

  • 证书验证失败:HTTPS证书绑定的是域名,证书的CN(通用名称)或SAN(主题备用名称)字段通常不包含IP地址,客户端会判定证书与访问地址不匹配,抛出ERR_CERT_COMMON_NAME_INVALID类错误。
  • SNI握手失败:TLS握手阶段需要发送SNI(服务器名称指示)告知服务器使用对应域名的证书,直接访问IP时SNI会被设置为IP,服务器无法匹配到对应证书,导致握手失败。

正确实现方式

1. Playwright:配置DNS解析覆盖

无需修改URL的hostname,通过Playwright的dnsOverrides配置让浏览器将指定域名解析到目标IP,请求的Host头和SNI会保持原域名,证书验证正常通过:

import { chromium } from "playwright";
import { resolve4 } from "dns/promises";

export const crawlPage = async (pageUrl: string) => {
  const url = new URL(pageUrl);
  const dnsRecords = await resolve4(url.hostname);
  const targetIp = dnsRecords[0]!;

  const browser = await chromium.launch();
  // 配置DNS映射,强制域名解析到指定IP
  const context = await browser.newContext({
    dnsOverrides: {
      [url.hostname]: targetIp,
    },
  });
  const page = await context.newPage();

  // 直接访问原域名,浏览器会自动使用指定IP连接
  await page.goto(pageUrl);
  console.log(`Page title: ${await page.title()}`);

  await browser.close();
};

调用方式:

await crawlPage("https://example.com");

2. Curl:使用--resolve参数

通过--resolve参数指定域名到IP的映射,客户端会用指定IP连接,同时保持Host头和SNI为原域名:

curl --resolve example.com:443:23.192.228.80 https://example.com

参数格式为域名:端口:IP,告诉curl访问目标域名的指定端口时,直接使用给定IP,无需DNS解析,同时自动处理Host头和SNI的正确设置。

是否需要过度思考?

如果你的爬虫没有特殊需求(比如测试特定服务器节点、绕过DNS污染、自定义DNS缓存策略),直接使用主机名是最优选择:

  • 现代浏览器和HTTP客户端都内置了高效的DNS缓存机制,解析性能开销可忽略。
  • 直接使用域名避免了手动处理DNS解析、证书验证等复杂问题,代码更简洁可靠。

只有当你有明确场景需要指定特定IP时,才需要使用上述DNS覆盖方案。

内容的提问来源于stack exchange,提问作者DK3Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:57:03