IIS URL 重写 - 将查询字符串键和值更改为路由

IIS URL Rewriting - Change a querystring key and value into a route

我最近在我的一个网站上实施了 IIS URL 重写。我正在使用 URL 重定向而不是重写所有内容。我所有的静态重定向都运行良好,但是,有一种特定类型的动态重定向我似乎无法使用。

我有旧的 URL 看起来像这样:

http://example.com/?tag=mytag

我希望将其重定向到新的 URL 格式:

http://example.com/tag/mytag

对于这些 URL,查询字符串键(标签)是已知且固定的,但是,查询字符串值(上例中的 "mytag")是完全动态的并且事先未知(因此我不认为因此可以使用 IIS 重写映射)。

是否可以添加一个 IIS 重写规则来对可能提供的所有可能的查询字符串值执行这种重定向?

是的,解决方案的内容如下。这是怎么回事...

第一个条件表示仅将此规则应用于网站的顶级。所以 http://example.com/?tag=mytag 会重定向,而 http://example.com/foobar/?tag=mytag 不会。

第二个条件是魔法。它仅在存在名为 tag 的查询参数时运行,并且 (.*) 是一个正则表达式,用于获取用于新 URL 的值。

该操作使用您在第二个条件中获取的值 {C:1}。 appendQueryString 完全按照它说的做 - 适当设置。 redirectType 应保留为 Temporary(HTTP 响应代码 307),直到您满意为止,然后将其更改为 Permanent(HTTP 响应代码 301)。一旦您发送 301 响应,客户端(/搜索引擎)可能会缓存该响应,并且不会从服务器重新请求,如果您犯了错误,则会导致问题。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>     
                <rule name="Redirect based on tag query value">                 
                    <conditions>
                        <add input="{REQUEST_URI}" pattern="$" />
                        <add input="{QUERY_STRING}" pattern="tag=(.*)" />
                    </conditions>
                    <action type="Redirect" url="tag/{C:1}/" appendQueryString="false" redirectType="Temporary" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>