2012-07-16 69 views
1

我正在将一些Sharepoint站点从一个服务器场迁移到另一个服务器场。这是一个更复杂一点,但为了简单起见...使用IIS 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

我尝试过使用重写映射,因为这些不是动态替换,但我无法让它们修改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

回答我的问题,什么工作对我来说是创造我自己的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> 
+0

嗨,我在面对问题类似的情况 - 你能否请回答 - http://stackoverflow.com/questions/34506551/reading-cookie-value-using-url-rewrite-for-iis-wizard-unable-to-validate-at – codetoshare 2015-12-30 04:38:00