IIS URL Rewrite移除.html后缀后出现404错误求助
问题原因
你的URL重写规则方向搞反了。当前规则会把/pages/service.html的请求内部重写到/pages/service,但服务器上并没有service这个实际存在的文件/资源,因此返回404错误。
解决方案
根据你的实际需求,分两种场景给出配置:
场景1:访问不带.html的URL时,内部加载对应.html文件(地址栏不变)
适合希望用户看到简洁URL,但实际加载原有.html文件的场景:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Rewrite to HTML" stopProcessing="true"> <!-- 匹配pages下不带.html的路径 --> <match url="^pages/(.*)$" /> <!-- 排除实际存在的文件/目录,避免重写已有的资源 --> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <!-- 避免匹配带.html的路径,防止循环重写 --> <add input="{REQUEST_URI}" pattern="\.html$" negate="true" /> </conditions> <!-- 内部重写到对应的.html文件 --> <action type="Rewrite" url="/pages/{R:1}.html" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
场景2:访问带.html的URL时,跳转到不带.html的URL(地址栏更新,SEO友好)
适合希望统一URL格式,让搜索引擎收录简洁地址的场景,需要同时配置重定向和内部重写规则:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <!-- 第一步:将带.html的URL重定向到简洁URL --> <rule name="Redirect HTML to Clean URL" stopProcessing="true"> <match url="^pages/(.*)\.html$" /> <conditions> <add input="{REQUEST_METHOD}" pattern="GET" /> <add input="{QUERY_STRING}" pattern="^$" /> </conditions> <!-- 301永久重定向,利于SEO --> <action type="Redirect" url="/pages/{R:1}" redirectType="Permanent" /> </rule> <!-- 第二步:让简洁URL能加载对应的.html文件 --> <rule name="Rewrite to HTML" stopProcessing="true"> <match url="^pages/(.*)$" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{REQUEST_URI}" pattern="\.html$" negate="true" /> </conditions> <action type="Rewrite" url="/pages/{R:1}.html" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
额外检查点
- 确认IIS已安装URL Rewrite模块,未安装需先添加该模块。
- 检查
pages目录下的service.html文件路径、权限是否正常。 - 测试前清空浏览器缓存,避免旧缓存干扰结果。
内容的提问来源于stack exchange,提问作者JustOneM0ment
相关产品推荐
相关产品推荐

