无法在URL中获取IIS URL重写句柄%3F
问题描述:
我使用URL重写将ci.pl的所有请求发送到我创建的代理(请求具有ci.pl,然后重定向到:/ proxy/handler .ashx;追加查询字符串:是)。很棒。显然有一个很老的客户端应用程序,发送以下请求:http://webserver.com/ci.pl%3F4+505000+0+0+5无法在URL中获取IIS URL重写句柄%3F
当它应该是发送:http://myserver.com/ci.pl?4+505000+0+0+5
什么最终发生的是,ci.pl规则被重定向到代理服务器,但由于?被收到,因为没有参数被包括在重定向%3F。
我不能更新旧的客户端应用程序,所以我一直在试图想出一个URL重写规则来检测%3F沿串到%3F权+通过。有没有人在那里做过类似的事情?
这是一个关闭的配置,但是%3F右侧的字符串没有被传递给代理。
<rewrite>
<rules>
<clear />
<rule name="Handle %3F" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{QUERY_STRING}" pattern="*ci.pl%3F*" />
</conditions>
<action type="Redirect" url="/proxy/handler.ashx?{C:2}" appendQueryString="false" />
</rule>
<rule name="Detect CI.PL">
<match url="(.*)" />
<conditions>
<add input="{PATH_INFO}" pattern="ci.pl" />
</conditions>
<action type="Rewrite" url="/proxy/handler.ashx" />
</rule>
</rules>
</rewrite>
答
以下为我工作:
匹配URL
- 请求的URL:匹配模式
- 使用:正则表达式
- 模式:
^ci\.pl(%3f|\?)(.*)
- 忽略案例:是
行动
- 动作类型:重定向
- 重定向URL:http://myserver.com/ci.pl {R:2}
- 追加查询字符串:没有
这是怎么运行的。 MATHES的URI上述正则表达式开始ci.pl
,接着为无论%3f
或?
与之后的任意字符的序列。该序列被捕获并且可以稍后被称为{R:2}
(2意味着“从左边开始的第二组圆括号”)。
例如,如果URI是http://webserver.com/ci.pl%3F4+505000+0+0+5,则{R:1}和{R:2}将分别持有%3F
和4+505000+0+0+5
,产生结果http://myserver.com/ci.pl?4+505000+0+0+5如预期。
这里的配置文件片段:
<rewrite>
<rules>
<rule name="ci" stopProcessing="true">
<match url="^ci\.pl(%3f|\?)(.*)" />
<action type="Redirect" url="http://myserver.com/ci.pl?{R:2}" appendQueryString="false" />
</rule>
</rules>
</rewrite>
希望这有助于。
嗯...您建议的表达式在我的本地服务器上似乎无法解析。当我使用URL重写模块测试一个url(http://localhost/ci.pl%3F4+505000+0+0+5)时,它返回“输入数据要测试与模式不匹配”。 – 2012-01-30 22:44:23
虽然这是正确的RegEx不能通过URL重写模块**测试**对话框解析,它看起来像请求被正确识别并发生重定向。问题解决了! – 2012-01-30 23:00:28
@RichScannell:在这种情况下,正则表达式试图仅匹配URL的路径部分(即,最后一个'/'和查询字符串之前的所有内容,请参阅http://en.wikipedia.org/wiki/URI_scheme#Examples) ,因此你必须在测试对话框中输入以下内容:'ci.pl%3F4 + 505000 + 0 + 0 + 5' – 2012-01-30 23:50:45