无法通过局域网IP访问Next.js应用,请求被重定向至HTTPS
一、本地IP/localhost请求被重定向到HTTPS的常见原因
Next.js配置强制HTTPS
你的项目next.config.js中可能配置了forceSSL选项,或者自定义了重定向规则强制跳转HTTPS。比如:module.exports = { forceSSL: true, // 该配置会强制所有请求跳转到HTTPS async redirects() { return [ { source: '/:path*', destination: 'https://your-local-ip:3000/:path*', permanent: true, }, ] }, }这类配置会让dev服务器自动把HTTP请求重定向到HTTPS,导致资源加载失败。
浏览器HSTS缓存
如果你之前曾用HTTPS访问过localhost或本地IP,浏览器会缓存HSTS(HTTP Strict Transport Security)规则,强制后续请求使用HTTPS。Mac的Chrome和iPhone模拟器的Safari都会继承这个缓存。代理工具或系统网络设置干扰
若Mac上运行了Charles、Proxyman这类代理工具,或者系统网络设置里开启了自动代理、SSL过滤,这些工具可能会把HTTP请求强制转换成HTTPS请求,导致资源加载异常。误设生产环境变量
如果环境变量NODE_ENV被设置为production,Next.js在dev模式下也可能触发生产环境的安全策略,强制使用HTTPS。
二、iPhone模拟器请求localhost被代理到HTTPS的原因
iPhone模拟器的网络栈直接复用Mac的网络配置,所以:
- 模拟器里的Safari会继承Mac浏览器的HSTS缓存,自动把localhost请求转成HTTPS;
- 如果Mac上有代理工具在运行,模拟器的所有网络请求都会走这个代理,被强制转成HTTPS;
- 若Next.js dev服务器被意外配置为启用HTTPS(比如加了
--experimental-https参数),模拟器请求时会自动使用HTTPS协议。
三、解决步骤
检查并修改Next.js配置
打开next.config.js,删除或注释掉forceSSL选项,以及任何强制HTTPS的重定向规则。保存后重启next dev服务。清除浏览器HSTS缓存
- Mac Chrome:打开
chrome://net-internals/#hsts,在“Delete domain security policies”输入框中分别输入localhost和你的本地IP(比如192.168.1.100),点击删除; - iPhone模拟器:打开设置→Safari浏览器→清除历史记录与网站数据,重启模拟器。
- Mac Chrome:打开
正确启动dev服务器
使用以下命令启动服务,明确允许所有IP访问并禁用HTTPS:next dev -H 0.0.0.0 -p 3000注意不要添加
--experimental-https参数,该参数会让dev服务器启用HTTPS。关闭代理工具与系统代理
暂时关闭Charles、Proxyman等代理工具,同时检查Mac系统设置→网络→高级→代理,确保所有代理选项都处于关闭状态。检查环境变量
在终端中执行echo $NODE_ENV,确认输出是development。如果是production,执行export NODE_ENV=development后重启dev服务。
内容的提问来源于stack exchange,提问作者Siyavash

