使用IIS URL重写模块修改查询字符串

时间:2012-07-16 21:22:28

标签: iis sharepoint-2010 url-rewriting

我正在将一些Sharepoint站点从一个服务器场迁移到另一个服务器场。它有点复杂,但为了简单起见......

我想要维护的是人们对这些网站,文档等的旧URL,而IIS URL重写模块似乎是一种很好的方法。

以下是结构的概念:

_______________________         _______________________
|oldfarm.company.com**|         |newfarm.company.com**|
|oldsitecollection**  |         |newsitecollection**  |
|subsitename          |         |subsitename          |
|...                  |         |...                  |
|_____________________|         |_____________________|

** =更改,其他所有内容保持不变,URLwise。

在“newfarm”上,我扩展了Web应用程序以响应“oldfarm.company.com”,该Web应用程序有一个URL重定向规则,可将http://oldfarm.company.com/oldsitecollection/ ...重定向到http://newfarm.company.com/newsitecollection/ ...

这对我正在尝试做的绝大多数事情都很有用。

我遇到的困难是重写QUERYSTRING值。 Sharepoint的Office文档查看器包含QUERYSTRING中的路径信息,这就是我需要更改的内容。

以下是原始网址示例: http://oldfarm.company.com/oldsitecollection/subsitename/_layouts/WordViewer.aspx?id=/oldsitecollection/subsitename/doclib/doc.docx&Source=http%3A%2F%2Foldfarm%2Ecompany%2Ecom%2Foldsitecollection%2Fsubsitename%2Fdoclib%2FForms%2FAllItems%2Easpx&DefaultItemOpen=1

以下是重定向后的网址(以及我被卡住的地方): http://newfarm.company.com/newsitecollection/subsitename/_layouts/WordViewer.aspx?id=/oldsitecollection/subsitename/doclib/doc.docx&Source=http%3A%2F%2Foldfarm%2Ecompany%2Ecom%2Foldsitecollection%2Fsubsitename%2Fdoclib%2FForms%2FAllItems%2Easpx&DefaultItemOpen=1

以下是我需要的网址: http://newfarm.company.com/newsitecollection/subsitename/_layouts/WordViewer.aspx?id=/newsitecollection/subsitename/doclib/doc.docx&Source=http%3A%2F%2Fnewfarm%2Ecompany%2Ecom%2Fnewsitecollection%2Fsubsitename%2Fdoclib%2FForms%2FAllItems%2Easpx&DefaultItemOpen=1

我尝试过使用重写映射,因为这些不是动态替换,但我无法让它们修改QUERYSTRING。

以下是我正在处理的重写规则的示例:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="WordViewer">
            <add key="id=/oldsitecollection" value="id=/newsitecollection" />
        </rewriteMap>
    </rewriteMaps>
    <rules>
        <rule name="Rewrite rule1 for WordViewer">
            <match url=".*WordViewer.aspx" />
            <conditions>
                <add input="{WordViewer:{QUERY_STRING}}" pattern="(.+)" />
            </conditions>
            <action type="Rewrite" url="{C:1}" appendQueryString="false" />
        </rule>
    </rules>
</rewrite>

1 个答案:

答案 0 :(得分:1)

要回答我自己的问题,对我有用的是创建我自己的custom rewrite provider

我创建的提供程序是一个简单的查找/替换提供程序,如下所示:

public class FindReplaceProvider : IRewriteProvider, IProviderDescriptor
{
    public string Find { get; private set; }
    public string Replace { get; private set; }

    public void Initialize(IDictionary<string, string> settings, IRewriteContext rewriteContext)
    {
        string tmpFind, tmpReplace;

        if (!settings.TryGetValue("Find", out tmpFind) || string.IsNullOrEmpty(tmpFind))
            throw new ArgumentException("FindReplaceProvider setting 'Find' is required and cannot be empty");

        if (!settings.TryGetValue("Replace", out tmpReplace))
            throw new ArgumentException("FindReplaceProvider setting 'Replace' is required and cannot be null");

        if (!string.IsNullOrEmpty(tmpFind))
            Find = tmpFind;
        else
            throw new ArgumentException("FindReplaceProvider parameter 'Find' cannot be empty");

        if (!string.IsNullOrEmpty(tmpReplace))
            Replace = tmpReplace;
        else
            Replace = String.Empty;
    }

    public string Rewrite(string value)
    {
        return Regex.Replace(value, Find, Replace, RegexOptions.IgnoreCase);
    }

    public IEnumerable<SettingDescriptor> GetSettings()
    {
        yield return new SettingDescriptor("Find", "String to find");
        yield return new SettingDescriptor("Replace", "String to replace");
    }
}

我的重写规则最终看起来像这样:

<rewrite>
  <providers>
    <provider name="OfficeWebAppsReplaceId" type="MyFindReplaceProvider">
      <settings>
        <add key="Find" value="id=/oldsitecollection" />
        <add key="Replace" value="id=/newsitecollection" />
      </settings>
    </provider>
    <provider name="OfficeWebAppsReplaceSource" type="MyFindReplaceProvider">
      <settings>
        <add key="Find" value="http%3A%2F%2Foldfarm%2Ecompany%2Ecom%2Foldsitecollection%2" />
        <add key="Replace" value="http%3A%2F%2Fnewfarm%2Ecompany%2Ecom%2Fnewsitecollection%2" />
      </settings>
    </provider>
  </providers>
  <rules>
    <rule name="OfficeWebAppsQuerystringRedirect" stopProcessing="true">
      <match url=".*(WordViewer.aspx|WordEditor.aspx|xlviewer.aspx|PowerPoint.aspx)$" />
      <conditions logicalGrouping="MatchAny">
        <add input="{QUERY_STRING}" pattern=".*id=/oldsitecollection.+" />
        <add input="{QUERY_STRING}" pattern=".*Source=http%3A%2F%2Foldfarm%2Ecompany%2Ecom%2Foldsitecollection%2F.+" />
      </conditions>
      <action type="Redirect" url="{R:0}?{OfficeWebAppsReplaceId:{OfficeWebAppsReplaceSource:{C:0}}}" appendQueryString="false" redirectType="Temporary" />
    </rule>
  </rules>
</rewrite>