2010-05-19 42 views
1

首先,我想为可笑的标题道歉。我并不想用“双向”这个词来表达自己的声音,但我真的无法想象用另一种方式来描述它。诺言。在IIS7.5中双向URL重写/重定向

对我的问题。我在我的Web.config的<system.webserver>/<rewrite>/<rules>部分有以下内容。

<!-- Who We Are --> 
<rule name="1A"> 
    <match url="^whoweare\.aspx$" /> 
    <action type="Redirect" url="who-we-are" redirectType="Permanent" /> 
</rule> 
<rule name="1B"> 
    <match url="^who-we-are$" /> 
    <action type="Rewrite" url="whoweare.aspx" /> 
</rule> 

<!-- What We Do --> 
<rule name="2A"> 
    <match url="^whatwedo\.aspx$" /> 
    <action type="Redirect" url="what-we-do" redirectType="Permanent" /> 
</rule> 
<rule name="2B"> 
    <match url="^what-we-do$" /> 
    <action type="Rewrite" url="whatwedo.aspx" /> 
</rule> 

现在这项工作非常有效。实际上,如果你访问的网址http://example.com/whoweare.aspx(这是实际 URL页面),你就可以301重定向到URL http://example.com/who-we-are(在虚拟 URL),如果你访问的虚拟URL,你会被重写为实际的URL。

这意味着超级性感的网址没有重复,也不会导致相互重写,所以全面微笑。

我的问题是这样的:这可以做得更优雅吗?

这是一个有点麻烦,必须写出两条规则,以确保一个被重定向到另一个,而另一个被重写为一个。是否可以编写一个规则来实现上述两个功能?

回答

2

Elegance是一个主观的术语,我想有几种方法会更好,比如使用Rewrite可扩展性和实现幻想映射逻辑,但到目前为止,我推荐的方式是使用2条规则,一个用于重定向,一个用于重写,并且利用重写地图可以使它更容易理解(但仍然很痛苦)来管理它们,例如在下面,您现在只需要维护地图,而不必再处理规则:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="Rewrite From Pretty URL" stopProcessing="true"> 
       <match url=".*" /> 
       <conditions> 
        <add input="{URLsToRewrite:{REQUEST_URI}}" pattern="(.+)" /> 
       </conditions> 
       <action type="Rewrite" url="{C:1}" appendQueryString="false" /> 
      </rule> 
      <rule name="Redirect To Pretty URL" stopProcessing="true"> 
       <match url=".*" /> 
       <conditions> 
        <add input="{URLsToRedirect:{REQUEST_URI}}" pattern="(.+)" /> 
       </conditions> 
       <action type="Redirect" url="{C:1}" appendQueryString="false" /> 
      </rule> 
     </rules> 
     <rewriteMaps> 
      <rewriteMap name="URLsToRewrite"> 
       <add key="/who-we-are" value="/whoweare.aspx" /> 
       <add key="/what-we-do" value="/whatwedo.aspx" /> 
      </rewriteMap> 
      <rewriteMap name="URLsToRedirect"> 
       <add key="/whoweare.aspx" value="/who-we-are" /> 
       <add key="/whatwedo.aspx" value="/what-we-do" /> 
      </rewriteMap> 
     </rewriteMaps> 
    </rewrite> 
</system.webServer> 
+0

Oooh,很好。我很惭愧地说我不知道​​重写地图。这当然似乎是一种更可维护的方法。但是,如果我问了一对夫妇关于您提供的代码中发生了什么的问题,您是否介意?首先,我不太清楚''实际上是否匹配,以及它如何匹配所有内容?其次,当本地工作时''REQUEST_URI}'会导致问题,因为我可能在更深的目录结构中工作而不是在发布版本中工作?最后,“{R:n}”和“{C:n}”有什么不同?感谢一群卡洛斯。 – 2010-05-20 07:44:10

+0

。*告诉它匹配URL中的所有内容(不包括查询字符串)来分析每个请求。 REQUEST_URI会将整个URL(包括查询字符串)绝对地匹配到网站“/”的根目录。一个简单的方法来看这是启用跟踪:http://learn.iis.net/page.aspx/467/using-failed-request-tracing-to-trace-rewrite-rules/ 最后{R: #}将在URL匹配中返回匹配项(在上面的例子中为*),并且{C:#}将返回条件中的匹配项(在这种情况下是应用地图的结果) 有一个URL Rewrite论坛, http://forums.iis.net/1152.aspx – 2010-05-20 15:29:49

+0

干杯队友。超级有用,非常感谢。 – 2010-05-25 11:24:55