我使用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(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