IIS部署React Node.js项目如何实现非www转www及HTTP跳转HTTPS
解决方案
核心问题原因
- IIS重写规则顺序错误:你把React路由重写规则放在了最前面,且开启了
stopProcessing="true",所有非静态文件、非/api路径的请求会直接被重写到根目录,不会执行后面的HTTP转HTTPS、非www转www的规则,导致内页跳转失效 - 同时在IIS层和Node.js层重复配置重定向逻辑,逻辑冲突会导致跳转异常
- 非www跳转规则未覆盖HTTPS场景下的非www域名访问
修正步骤
第一步:调整web.config规则顺序和逻辑
IIS重写规则是从上到下匹配执行的,要把重定向类规则放在最前面,路由重写规则放在最后,修正后的完整配置如下:
<?xml version="1.0"?> <configuration> <system.webServer> <rewrite> <rules> <!-- 1. HTTP转HTTPS规则放最前面 --> <rule name="httptohttps" stopProcessing="false"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" /> </rule> <!-- 2. 非www跳www规则 --> <rule name="non-wwwtowww" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern="^example\.com$" /> </conditions> <action type="Redirect" url="https://www.example.com{REQUEST_URI}" redirectType="Permanent" /> </rule> <!-- 3. React路由重写规则放最后 --> <rule name="React Routes" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" /> </conditions> <action type="Rewrite" url="/" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
第二步:删除Node.js层的重定向代码
你写的Node.js重定向逻辑可以全部移除,IIS层已经完成所有重定向处理,重复配置会导致逻辑冲突,反而出现跳转异常。如果确实要保留Node层逻辑,需要额外配置IIS转发X-Forwarded-Proto请求头,没必要额外增加复杂度。
第三步:清理缓存测试
301永久重定向会被浏览器长期缓存,修改配置后需要清理浏览器缓存,或者用无痕模式测试跳转效果。
验证效果
调整后所有场景都会正常跳转:
- 访问
http://example.com/xyz→ 跳转到https://www.example.com/xyz - 访问
http://www.example.com/xyz→ 跳转到https://www.example.com/xyz - 访问
https://example.com/xyz→ 跳转到https://www.example.com/xyz - 所有跳转后的页面路由都能正常加载,不会出现404
内容的提问来源于stack exchange,提问作者sudesh sharma
相关产品推荐
相关产品推荐

