IIS重写并将带空格的字符串传递给Querystring

时间:2015-12-10 04:30:14

标签: iis url-rewriting iis-7.5

我试图在IIS中使用重写规则来路由这样的请求:

domain.com/users/some%20user%20name

domain.com/cms.asp?P=users/some user name

我看到的问题是规则是完全删除空格。这是我使用的规则:

            <rule name="Rewrite Everything Else to cms.asp" stopProcessing="true">
                <match url="(.*)" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                <action type="Rewrite" url="cms.asp?p={R:1}" logRewrittenUrl="true" />
            </rule>

在重写过程中导致空格被删除的原因是什么?如何防止空格?

1 个答案:

答案 0 :(得分:1)

您不能在网址中包含空格。 http规范说明

  

必须转义URL中的空格和控制字符才能传输   在HTTP中,必须有其他不允许的字符。

See here

如果您希望更具可读性,可能会将编码空格的规则重写为下划线或短划线。如果你有一定数量的空格,你可以用

之类的东西来捕捉它
<rule name="Rewrite Everything Else to cms.asp" stopProcessing="true">
            <match url="^(.*)%20(.*)%20(.*)%20(.*)" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false"      />
            <action type="Rewrite" url="{R:1}-{R:2}-{R:3}-{R:4}" logRewrittenUrl="true" />
        </rule>

然后重复输入:

^(.*)%20(.*)%20(.*)         replaced by:  {R:1}-{R:2}-{R:3}
^(.*)%20(.*)                replaced by:  {R:1}-{R:2}

将处理两个和一个空格。

如果您的空格数量未知,则可能需要实施IIS重写模块。

有关详细信息,请参阅herehere