首页 > 解决方案 > IIS URL 重写 - 将查询字符串键和值更改为路由

问题描述

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

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

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

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

http://example.com/tag/mytag

对于这些 URL,查询字符串键(标签)是已知和固定的,但是,查询字符串值(上例中的“mytag”)是完全动态的并且事先未知(所以我不相信因此可以使用 IIS Rewrite Maps )。

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

标签: iisdynamicurl-rewritingurl-rewrite-module

解决方案


是的,解决方案的内容如下。发生的事情是...

第一个条件意味着仅将此规则应用于站点的顶层。所以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>

推荐阅读