如何使用IIS Rewrite替换URL中的%5E以适配目标应用?
哎,这个问题我太熟了!之前帮朋友排查过几乎一样的场景,咱们来一步步搞定它~
首先得说清楚你之前的规则为啥没生效:IIS URL Rewrite模块默认会先对URL进行解码,再执行匹配逻辑。当Safari发送%5E时,IIS已经自动把它解码成^了,你写的正则(.*)%5E(.*)自然匹配不到任何内容,规则当然不会触发。而且就算你侥幸匹配到了,默认情况下IIS还会把重写后的URL再次编码,把^又转回%5E,等于白忙活一场。
正确的IIS Rewrite规则配置
你需要针对性地调整规则,让它在原始未编码的URL上匹配,同时禁用重写后的URL编码,确保^能以明文形式传递给目标应用。具体步骤如下:
- 打开IIS管理器,找到你的目标站点,进入「URL重写」功能
- 点击「添加规则」,选择「空白规则」
- 按以下内容配置:
- 规则名称:比如
Replace %5E with ^ in Query String(起个好记的名字) - 匹配URL:
- 请求路径:选择「与模式匹配」
- 模式:
^application\.aspx$(注意转义点号,确保只匹配目标页面) - 使用:正则表达式
- 勾选「使用原始URL编码」(这是核心!让模块用未解码的原始URL来匹配)
- 条件:
- 点击「添加」,设置:
- 输入:
{QUERY_STRING} - 检查输入字符串是否:与模式匹配
- 模式:
(.*)%5E(.*)(匹配包含%5E的查询字符串) - 忽略大小写:勾选
- 输入:
- 点击「添加」,设置:
- 操作:
- 操作类型:重写
- 重写URL:
application.aspx?{C:1}^{C:2}(把匹配到的前后内容用^连接) - 勾选「停止处理后续规则」
- 点击重写URL右侧的「...」按钮,在弹窗里勾选「不编码重写后的URL」(避免
^被再次转成%5E)
- 规则名称:比如
- 点击「应用」保存规则
对应的web.config代码如下(直接复制粘贴也能用):
<rewrite> <rules> <rule name="Replace %5E with ^ in Query String" stopProcessing="true"> <match url="^application\.aspx$" useOriginalURLEncoding="true" /> <conditions> <add input="{QUERY_STRING}" pattern="(.*)%5E(.*)" /> </conditions> <action type="Rewrite" url="application.aspx?{C:1}^{C:2}" encodeUrl="false" /> </rule> </rules> </rewrite>
为啥这个规则能生效?
useOriginalURLEncoding="true":让Rewrite模块直接识别原始URL里的%5E,而不是先解码成^encodeUrl="false":禁止IIS对重写后的URL编码,确保^以明文形式传递给目标应用- 精准的匹配条件:只针对目标页面和包含
%5E的查询字符串生效,不会影响其他请求
额外测试建议
配置完之后,用Safari访问测试URL,去目标应用的请求日志里确认一下:查询字符串里的%5E是不是已经被替换成^了。如果还是没生效,可以开启IIS Rewrite的日志功能(在「URL重写」右侧点击「查看日志」),排查是匹配环节还是操作环节出了问题。
内容的提问来源于stack exchange,提问作者crazyivan
相关产品推荐
相关产品推荐

