【问题标题】:Can't get IIS URL Rewrite handle %3F in URL无法在 URL 中获取 IIS URL 重写句柄 %3F
【发布时间】:2012-02-22 12:10:31
【问题描述】:

我正在使用 URL Rewrite 将 ci.pl 的所有请求发送到我创建的代理(请求具有 ci.pl 然后重定向到:/proxy/handler.ashx;附加查询字符串:是的)。效果很好。显然有一个非常旧的客户端应用程序发送以下请求:http://webserver.com/ci.pl%3F4+505000+0+0+5

什么时候应该发送: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 iis rewrite


    【解决方案1】:

    以下内容对我有用:

    匹配网址

    • 请求的 URL:匹配模式
    • 使用:正则表达式
    • 模式:^ci\.pl(%3f|\?)(.*)
    • 忽略大小写:是

    动作

    这就是它的工作原理。上面的正则表达式计算以ci.pl 开头的URI,后跟%3f?,之后是任意字符序列。该序列被捕获,以后可以称为{R:2}(2 表示“从左边开始的第二组括号”)。

    例如,如果 URI 是 http://webserver.com/ci.pl%3F4+505000+0+0+5,则 {R:1} 和 {R:2} 将分别保存 %3F4+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 Rewrite 模块测试 url (localhost/ci.pl%3F4+505000+0+0+5) 时,它返回“要测试的输入数据与模式不匹配。”
    • 虽然 RegEx 确实无法通过 URL 重写模块 Test 对话框解析,但看起来请求已正确识别并且发生了重定向。问题解决了!
    • @RichScannell:在这种情况下,正则表达式尝试仅匹配 URL 的路径部分(即最后一个 / 之后和查询字符串之前的所有内容,请参阅 en.wikipedia.org/wiki/URI_scheme#Examples),因此您必须在“测试”对话框中输入以下内容:ci.pl%3F4+505000+0+0+5
    • 啊。谢谢。我没有意识到正则表达式中的“^”有这种影响。我认为这可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2018-05-15
    • 2016-06-27
    • 2013-06-16
    相关资源
    最近更新 更多