You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IIS中移除Shebang并强制HTTPS的URL重写规则问题

解决URL中#!符号移除时的重定向错误问题

嘿,我来帮你拆解这个问题——你遇到重定向错误的核心原因其实很关键:浏览器压根不会把URL里#(锚点)及其后面的内容发送给服务器!所以你在服务器端的URL重写规则里,不管是匹配{QUERY_STRING}还是{REQUEST_URI}里的#!,都是白忙活——服务器根本接收不到这部分内容,自然会出问题。

先说说你现有规则的问题

你配置里试图匹配{QUERY_STRING}中的.+\#!.*,但这里有两个误区:

  • #不属于查询字符串(查询字符串是?后面的内容),服务器永远拿不到这部分值
  • {REQUEST_URI}也只包含#之前的路径部分,同样抓不到#!

给你两个可行的解决方案

根据你的场景,推荐两种处理方式:

1. 前端层面处理(最靠谱)

因为#!大多是前端路由的hash模式标识(比如旧版AngularJS的路由),最合理的做法是在前端代码里改路由配置,换成HTML5 History模式(直接去掉#!),同时给服务器加个SPA路由的 fallback 规则(比如IIS里配置所有非静态资源请求都指向index.html)。

如果暂时没法改前端代码,也可以在页面加载时用JS做前端重定向:

if (window.location.hash.startsWith('#!')) {
  const newUrl = window.location.href.replace('#!', '');
  window.location.replace(newUrl);
}

这种方式能直接在用户浏览器里处理,服务器完全不用操心。

2. 服务器端特殊适配(仅部分场景有效)

如果必须在服务器端处理,只有当外部链接带#!进来时,浏览器会自动把#!转换成?_escaped_fragment_=(这是早年Google为了爬取AJAX页面推出的协议),这时可以通过匹配这个特殊参数来做重定向:

<rule name="Remove #! via escaped fragment" stopProcessing="true">
  <match url=".*" />
  <conditions logicalGrouping="MatchAll">
    <add input="{QUERY_STRING}" pattern="_escaped_fragment_=(.*)" />
    <add input="{HTTPS}" pattern="on" /> <!-- 确保已经完成HTTPS跳转 -->
  </conditions>
  <action type="Redirect" url="/{C:1}" appendQueryString="false" redirectType="Permanent" />
</rule>

注意:这个方法只对遵循_escaped_fragment_协议的请求有用,用户直接在地址栏输入带#!的URL的话,服务器还是处理不了。

顺便优化下你的HTTPS强制规则

你的HTTPS强制规则可以简化得更清晰,避免逻辑混乱,记得把它放在所有重写规则的最前面:

<rule name="Force HTTPS" stopProcessing="true">
  <match url="(.*)" />
  <conditions>
    <add input="{HTTPS}" pattern="off" />
  </conditions>
  <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:45:00