1

我正在将一些 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 中包含路径信息,这就是我需要更改的内容。

这是一个原始 URL 示例: 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

这是重定向后的 URL(也是我卡住的地方): 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

这是我需要的 URL 的样子: 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

我曾尝试使用 Rewrite Maps,因为这些不是动态替换,但我无法让它们修改 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>
4

1 回答 1

1

为了回答我自己的问题,对我有用的是创建我自己的自定义重写提供程序

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

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>
于 2012-07-23T19:02:38.067 回答