Flutter Web生产环境移除URL哈希后刷新出现404错误的解决方案咨询
Flutter Web生产环境移除URL哈希后刷新出现404错误的解决方案咨询
兄弟,我之前也碰到过和你完全一样的问题!你这个情况本质是Flutter Web属于单页应用(SPA),当你用PathUrlStrategy()去掉URL里的哈希后,开发模式下Flutter自带的调试服务器已经帮你处理了路由转发,但部署到IIS上时,刷新页面的请求会被IIS当成物理文件路径去查找——可这些路由都是前端虚拟路由,根本没有对应的物理文件,所以直接返回404了。
给你整理了一套亲测有效的解决步骤,适配你用的Flutter 3.29.0和IIS环境:
1. 先确认IIS安装了URL重写模块
IIS默认没有自带URL重写功能,你需要先安装URL重写模块v2(去微软官方渠道下载安装即可,安装完成后重启IIS)。
2. 修改web.config配置
在你现有的web.config文件里,给<system.webServer>节点添加URL重写规则,完整配置如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <!-- 保留你原来的staticContent配置 --> <staticContent> <mimeMap fileExtension=".arb" mimeType="application/json" /> <mimeMap fileExtension=".frag" mimeType="text/plain" /> <mimeMap fileExtension=".wasm" mimeType="application/wasm" /> <mimeMap fileExtension=".env" mimeType="text/plain" /> <mimeMap fileExtension=".symbols" mimeType="text/plain" /> <mimeMap fileExtension=".last_build_id" mimeType="text/plain" /> </staticContent> <!-- 新增URL重写规则 --> <rewrite> <rules> <rule name="Flutter SPA Routes" stopProcessing="true"> <!-- 匹配所有不是物理文件、不是物理目录的请求 --> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <!-- 将请求转发到index.html,交给Flutter前端路由处理 --> <action type="Rewrite" url="index.html" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
3. 额外的IIS站点配置检查
- 确保你的IIS站点的应用池设置里,.NET CLR版本选择
无托管代码(因为Flutter Web是静态站点,不需要.NET托管) - 确认所有Flutter build出来的web文件(包括index.html、assets文件夹等)都正确上传到了IIS站点的根目录
验证效果
修改完配置后,重启你的IIS站点,然后:
- 访问不带哈希的路由,比如
http://ip_address:port/my_app - 刷新页面,应该不会再出现404错误了
- 直接访问任意前端路由路径,也能正常加载页面
这个配置的核心就是让IIS把所有非物理资源的请求都转发到Flutter的入口文件index.html,这样前端路由就能接管这些请求,和开发模式下的行为保持一致了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

