将查询字符串附加到IIS重写映射

时间:2011-01-16 23:03:42

标签: asp.net iis url-rewriting iis-7

我有一个ReWrite Map,我想将请求的URL中的任何查询参数附加到重写的URL。

例如:

  • / page / abc / ---> /index.cfm?page=abc (工作)
  • / page / abc /?param1 = 111 ---> /index.cfm?page=abc&param1=111 (不起作用)
  • / page / abc /?param3 = 333& param4 = 444 ---> /index.cfm?page=abc&param3=333&param4=444 (不起作用)

我的web.config是:

[...]
<rules>
    <clear />
    <rule name="Rewrite rule1 for SiteMapEngine">
        <match url=".*" />
        <conditions>
            <add input="{SiteMapEngine:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Rewrite" url="{C:1}" appendQueryString="true" />
    </rule>
</rules>
[...]

3 个答案:

答案 0 :(得分:24)

简答:

使用PATH_INFO服务器变量而不是REQUEST_URI,因为您不希望在匹配中包含查询字符串。

完整说明:

之前我已经抓住了 - 基本上它是在IIS URL重写模块中使用Rewrite Maps的一个微妙之处。

在您的情况下,SiteMapEngine将是URL的静态键值列表:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="SiteMapEngine" defaultValue="">
            <add key="/page/abc/" value="/index.cfm?page=abc" />
            ...
        </rewriteMap>
    </rewriteMaps>
    ...
</rewrite>

规则中的{SiteMapEngine:{REQUEST_URI}}条件检查此重写映射中是否存在与REQUEST_URI服务器变量匹配的键:

{REQUEST_URI} = /page/abc/?param1=111

请注意,此变量包含查询字符串 - 因此无法找到匹配的密钥。

相反,使用PATH_INFO服务器变量,它是等效于REQUEST_URI但没有查询字符串

{PATH_INFO} = /page/abc/

所以正确的规则是:

<rule name="Rewrite rule1 for SiteMapEngine">
    <match url=".*" />
    <conditions>
        <add input="{SiteMapEngine:{PATH_INFO}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="{C:1}" />
</rule>

答案 1 :(得分:11)

如果我能找到这方面的参考资料,我会被诅咒,但我的理解是,在某些版本的IIS {REQUEST_URI}中没有它的查询字符串,如果启用了重写,它将完全为空。

您应该可以使用{PATH_INFO}。

这个错误报告(针对Drupal!)是您正在描述的问题,我认为:http://drupal.org/node/298016

Microsoft提供了一个修补程序,但我没有尝试过:http://support.microsoft.com/kb/954946

答案 2 :(得分:0)

这是我的规则。它似乎按预期工作:

<rule name="Insert index.cfm" enabled="true" stopProcessing="true">
    <match url="^(.*)$" ignoreCase="false" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="index.cfm/{PATH_INFO}" appendQueryString="true" />
</rule>