1

一部の SharePoint サイトをあるファームから別のファームに移行中です。もう少し複雑ですが、簡単にするために...

私が維持したいのは、人々がこれらのサイトやドキュメントなどのために持っている古い URL です。IIS URL Rewrite Module は良い方法のようです。

構造がどのようなものかについては、次のとおりです。

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

** = 変更、他のすべては同じまま、URL ごと。

「newfarm」では、「oldfarm.company.com」に応答するように Web アプリケーションを拡張しました。その Web アプリケーションには、http ://oldfarm.company.com/oldsitecollection/ ... をhttpにリダイレクトする URL リダイレクト ルールがあります。 ://newfarm.company.com/newsitecollection/ ...

これは、私がやろうとしていることの大部分でうまく機能します。

私が苦労しているのは、QUERYSTRING 値の書き換えです。Sharepoint の Office Document Viewer には、QUERYSTRING にパス情報が含まれており、それを変更する必要があります。

元の URL サンプルは次のとおり です。 2Ecom%2Foldsitecollection%2Fsubsitename%2Fdoclib%2FForms%2FAllItems%2Easpx&DefaultItemOpen=1

リダイレクト後の URL (および私が立ち往生している場所) は次のとおりです 。 %3A%2F%2Foldfarm%2Ecompany%2Ecom%2Foldsitecollection%2Fsubsitename%2Fdoclib%2FForms%2FAllItems%2Easpx&DefaultItemOpen=1

必要な URL は次のとおりです 。 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>
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 に答える