2010-05-19 76 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