Next.js fetch请求自动将HTTP转为HTTPS的问题解决咨询
看起来你遇到了个挺闹心的问题——Next.js应用里发起的HTTP请求被自动转成了HTTPS,导致出现307内部重定向错误,但手动在无痕窗口访问那个HTTP地址却完全正常。我来帮你梳理几个可能的解决方向:
1. 先核对基础配置是否正确
首先得确认publicRuntimeConfig里的API_BASE_URL_MAIN是不是实打实的HTTP开头?有时候可能环境变量配置错了,或者不小心把地址写成了HTTPS,先把这个最基础的点排查掉。
另外,检查你的next.config.js里有没有开启HTTPS相关的强制配置,比如https: true这类设置,如果有的话,先注释掉再试试——开发环境下Next.js默认不会强制HTTPS,可能是这个配置在搞鬼。
2. 调整fetch请求的重定向处理逻辑
你已经尝试了redirect: 'error',可以再进一步明确设置follow: false来阻止自动跟随重定向,这样能更清楚地看到是哪里触发了地址转换。修改你的fetch代码试试:
fetch(`${baseUrl}${endpoint}`, { redirect: 'manual', // 也可以保留'error',手动处理重定向能更直观排查问题 follow: false })
这样如果有重定向发生,你能直接在response里看到状态码,方便排查是Next.js内部、浏览器还是API服务端发起的重定向。
3. 检查中间件或代理的影响
如果你用了Next.js的Middleware(中间件),得看看middleware.ts/middleware.js里有没有强制把所有HTTP请求转成HTTPS的逻辑,比如类似这样的代码:
if (request.nextUrl.protocol !== 'https') { return NextResponse.redirect(new URL(`https://${request.nextUrl.host}${request.nextUrl.pathname}`)) }
如果有这种全局重定向逻辑,记得给你的API请求地址加个例外,让它跳过这个转换。
另外,要是你在next.config.js里配置了rewrites或者代理规则,也可能导致地址被强制转换,检查这些配置里有没有涉及HTTPS的设置。
4. 浏览器混合内容策略的影响(开发环境)
如果你的Next.js应用本身是在HTTPS环境下运行的(比如本地用https://localhost启动),浏览器的混合内容安全策略会自动阻止HTTP请求,甚至偷偷转成HTTPS。这时候你可以切换到HTTP模式启动Next.js:
next dev -H 0.0.0.0 -p 3000 --no-https
这样应用以HTTP方式运行,发起HTTP请求就不会被浏览器拦截转换了。
5. 确认API服务端的响应头
虽然你手动访问没问题,但有时候API服务端可能会返回重定向到HTTPS的响应头(比如Location字段)。你可以用curl命令测试一下:
curl -v http://你的API地址
看看响应里有没有307或302的重定向状态码,如果有的话,那问题其实出在API服务端,需要调整服务端配置,不要对这个请求做HTTPS重定向。
备注:内容来源于stack exchange,提问作者Aleksa Ristic

