使用HttpPlatformHandler的IIS站点特定路由无法跳转至Next.js站点
IIS部署Next.js子路径404问题排查与解决
核心问题
- 访问
http://localhost/AppWithNode1/SimpleErrorView时,Next.js返回404错误页面 - 控制台显示JS、CSS等静态资源也返回404
- 已配置
next.config.mjs中的basePath和assetPrefix,但问题未解决
1. 确认Next.js构建配置
确保next.config.mjs的配置完全匹配IIS子路径,代码如下:
/** @type {import('next').NextConfig} */ const nextConfig = { basePath: '/AppWithNode1', assetPrefix: '/AppWithNode1', output: 'standalone', // 推荐用此模式,减少部署依赖 } export default nextConfig
注意:
basePath和assetPrefix必须和IIS子应用路径完全一致,包括大小写。配置完成后,重新执行npm run build构建项目。
2. 修正IIS web.config重写规则
web.config需要正确映射静态资源并转发页面请求到Next.js服务,示例配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <!-- 优先处理Next.js静态资源,避免被页面规则拦截 --> <rule name="Next.js Static Files" stopProcessing="true"> <match url="^AppWithNode1/_next/(.*)" /> <action type="Rewrite" url="_next/{R:1}" /> </rule> <!-- 非文件/目录的请求转发到Next.js服务 --> <rule name="Next.js Pages" stopProcessing="true"> <match url="^AppWithNode1/(.*)" /> <action type="Rewrite" url="server.js/{R:1}" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> </rule> </rules> </rewrite> <!-- 配置iisnode调用Node.js进程 --> <handlers> <add name="iisnode" path="server.js" verb="*" modules="iisnode" /> </handlers> <iisnode nodeProcessCommandLine="C:\Program Files\nodejs\node.exe" /> </system.webServer> </configuration>
关键注意点:
- 静态资源规则要放在页面规则前面,确保
_next目录下的资源能直接访问- 页面规则要排除实际存在的文件和目录,防止静态资源被错误转发
- 确认服务器已安装并启用
iisnode模块
3. 检查IIS站点配置
- 确认默认站点下的
AppWithNode1应用程序,物理路径指向Next.js构建后的out目录(或standalone模式下的对应目录) - 将应用程序池的.NET CLR版本设置为无托管代码,避免与Node.js运行冲突
4. 验证静态资源路径
构建完成后,查看out/_next/static目录下的资源文件,检查其引用路径是否包含/AppWithNode1前缀。如果没有,说明basePath配置未生效,需重新确认next.config.mjs并重新构建。
5. 日志排查
- 查看IIS请求日志(默认路径:
C:\inetpub\logs\LogFiles),确认请求是否被正确重写 - 查看Next.js服务的控制台输出,确认服务是否接收到请求,以及请求路径是否符合预期
内容的提问来源于stack exchange,提问作者user581157
相关产品推荐
相关产品推荐

