Share via


搭配 URL 重寫模組使用自定義重寫提供者

Ruslan Yakushev

本逐步解說將引導您瞭解如何搭配URL重寫模組2.0使用自定義重寫提供者。 本逐步解說使用 URL Rewrite 2.0 擴充性範例,您可以從 MSDN 程式代碼庫的 URL Rewrite Extensibility Samples 下載。

安裝 URL 重寫擴充性範例

若要完成本逐步解說,請下載並安裝 URL Rewrite Extensibility Samples (https://www.microsoft.com/download/details.aspx?id=43353)。 擴充性範例安裝套件包含 .NET 元件和原始程式碼,其中包含三個最常見使用案例的重寫提供者完整實作:

  • 將重寫或重新導向對應儲存在 SQL 資料庫中;
  • 將重寫或重新導向對應儲存在文本檔中;
  • 將查閱子字串儲存在文字檔中。

在安裝期間,請務必在自定義安裝中選取 [運行時間] 選項。 這會在 .NET 全域程式集緩存中註冊範例提供者,以便URL重寫模組使用它們。

[I I S U R L 重寫擴充性範例設定] 對話框的螢幕快照。[運行時間] 圖示會反白顯示。

註冊提供者

安裝套件中包含 3 個重寫提供者:

  • DbProvider - 此提供者可以藉由執行預存程式,從 SQL Server 資料庫數據表擷取重寫對應
  • FileMapProvider - 此提供者可用來擷取儲存在文本檔中的重寫對應
  • FileContainsProvider - 此提供者可用來檢查文字檔中的任何字串是否為提供者輸入字串的子字串。

若要在重寫規則中使用範例提供者,您必須向 IIS 註冊提供者。 若要註冊提供者,您可以使用 IIS 管理員使用者介面:

  1. 在 IIS 管理員中開啟 URL 重寫功能;
  2. 選取 [檢視提供者...]右側 [動作] 窗格中的動作;
    I S Manager U R L Rewrite 首頁的螢幕快照。在右側的 [動作] 窗格中,會反白顯示 [檢視提供者]。
  3. 選取 [新增提供者...][動作] 窗格中的動作;
  4. 在 [新增提供者] 對話框中,從重寫規則參考此提供者時,輸入您想要用於此提供者的名稱。
  5. 之後,請在 [Managed Type] 下拉式清單中為提供者選擇對應的 .NET 類型。 請注意,提供者類型可能需要一些時間才會出現在該處。
    [I S 管理員] 頁面的螢幕快照。[重寫提供者] 頁面隨即顯示。在右側的 [動作] 窗格中,反白顯示 [新增提供者]。
  6. 重複上述步驟以註冊這三個提供者。

使用 DbProvider

若要使用 DbProvider,您需要存取 Microsoft SQL Server。 提供者會連線到 SQL Server 資料庫,並執行預存程式,這個預存程式會接受包含輸入 URL 字串的 NVARCHAR 輸入參數,並傳回一個數據列,一個數據行結果集,其中包含 NVARCHAR 類型的輸出 URL 字符串。

建立範例資料庫

開啟 SQL Server Management Studio,開啟新的查詢視窗,然後執行下列 SQL 腳本:

USE [master]

CREATE LOGIN [IIS APPPOOL\DefaultAppPool] FROM WINDOWS WITH DEFAULT_DATABASE=[master]

CREATE DATABASE [RewriteDB]
GO

USE [RewriteDB]
GO

CREATE TABLE [dbo].[RewriteTable](
[OriginalUrl] [nvarchar](256) NOT NULL,
[NewUrl] [nvarchar](256) NOT NULL
) ON [PRIMARY]
GO

CREATE PROCEDURE [dbo].[GetRewrittenUrl] 
@input nvarchar(256)
AS
SELECT rt.NewUrl 
FROM dbo.RewriteTable rt 
WHERE rt.OriginalUrl = @input
GO

CREATE USER [IIS APPPOOL\DefaultAppPool] FOR LOGIN [IIS APPPOOL\DefaultAppPool]

GRANT EXECUTE ON dbo.GetRewrittenUrl TO [IIS APPPOOL\DefaultAppPool];
GO

INSERT INTO dbo.RewriteTable VALUES ('old/catalog/product.html', 'new/category/product.html');
INSERT INTO dbo.RewriteTable VALUES ('old/contactus/index.html', 'new/contactus.html');
GO

上述腳本會建立名為 RewriteDB 的新資料庫,其中包含 Table RewriteTable 和預存程式 GetRewrittenURL。 它也會將許可權授與 IIS APPPOOL\DefaultAppPool 帳戶,以執行該預存程式。 此外,也會填入資料庫數據表與兩個URL對應。

設定 DbProvider 設定

設定 DbProvider 實體以呼叫預存程式:

  1. 在 [URL 重寫] 功能檢視的 [IIS 管理員] 中,選取 [檢視提供者...]。int 操作窗格。
  2. 選取 [新增提供者],然後選擇 [DbProvider]。 將它命名為 DB;這將是您將從重寫規則參考提供者的名稱
  3. 選取名為 DB 的 DbProvider 實例,然後按兩下 [新增提供者設定...]行動。
  4. 使用 [編輯提供者設定] 對話框來設定提供者:
    [I S 管理員] 頁面的螢幕快照。[重寫提供者] 頁面隨即顯示。[編輯提供者設定] 對話框隨即出現,而 [名稱] 方塊中的文字為 S Q L Server 連接字串。

針對提供者設定使用下列值:

  • SQL Server 連接字串:提供 SQL Server 連接字串,例如:
    “Data Source=servername\sqlexpress;初始目錄=RewriteDB;整合式安全性=True”
  • 預存程式名稱:GetRewrittenUrl
  • 快取分鐘間隔:如果 SQL 數據表中的值沒有變更,或設定為正整數,讓提供者定期重新整理模組的內部重寫快取,則設定為 0。 如果未指定,則會假設值為 0。

從重寫規則呼叫 DbProvider

在網站的根目錄中,開啟 web.config 檔案。 如果您使用 IIS 預設網站,則檔案應該位於 C:\inetpub\wwwroot\ 資料夾中。

將下列重新導向規則貼到 元素內的 /<configuration>/<system.webServer>/<rewrite>/<rules> web.config 檔案中:

<rule name="DbProviderTest" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{DB:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Redirect" url="{C:1}" />
</rule>

web.config 檔案的完整內容應該如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="DB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="ConnectionString" value="Data Source=ruslany-server\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" />
                <add key="StoredProcedure" value="GetRewrittenUrl" />
                <add key="CacheMinutesInterval" value="0" />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="DbProviderTest" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{DB:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
        </rule>
    </rules>
</rewrite>

此規則會執行 HTTP 重新導向至透過 DbProvider 從 SQL Server 資料庫取得的 URL。 名為 「DB」 的 DbProvider 實例會從規則的條件叫用,如果從提供者傳回的結果不是空的,則會執行 HTTP 重新導向。

若要測試規則開啟網頁瀏覽器,並要求 http://localhost/old/catalog/product.htmlhttp://localhost/old/contactus/index.html。 請注意,瀏覽器會根據 RewriteDB 資料庫數據表中定義的重新導向對應,重新導向至新的 URL。 網頁伺服器會針對重新導向的 URL 傳回 HTTP 404 錯誤,因為伺服器上沒有這類檔案或目錄,但這與本逐步解說的目的無關。 重要的是,網頁伺服器會根據使用 DbProvider 的規則發出重新導向回應。

使用 FileMapProvider

FileMapProvider 會從文本文件讀取 URL 對應。 當重寫地圖項目數量非常大,而且在 web.config 檔案中保留它們並不實用時,可以使用它,而不是內建的重寫對應功能。

建立範例對應檔案

在網站的根目錄中建立名為 App_Data 的新目錄。 在該目錄中,建立名為 redirectmappings.txt 的文本檔。 將下列幾行新增至 檔案:

old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html

顯示警告附註之前警告符號的影像。警告: 請務必確定無法直接從 Web 存取文字檔。 使用 IIS 要求篩選模組或將檔案放在 App_Data資料夾內,以防止 HTTP 用戶端直接存取此檔案的內容。

設定 FileMapProvider

依照設定 DbProvider 中所述 的相同步驟來設定 FileMapProvider。 針對提供者設定使用這些值:

  • FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt (請注意檔案路徑中的 {DOCUMENT_ROOT} 用法。這會取代為提供者初始化期間的實際路徑。當您不想在 web.config 檔案中放置絕對檔案路徑時,這會很有用。
  • IgnoreCase:1
  • 分隔符:「如果未指定,則會使用 TAB 符號作為分隔符)

從重寫規則呼叫 FileMapProvider

在網站的根目錄中,開啟 web.config 檔案。 如果您使用 IIS 預設網站,則檔案應該位於 C:\inetpub\wwwroot\ 資料夾中。

將下列重新導向規則貼到 元素內的 /<configuration>/<system.webServer>/<rewrite>/<rules> web.config 檔案中:

<rule name="FileMapProviderTest" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{FileMap:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Redirect" url="{C:1}" />
</rule>

web.config 檔案的完整內容應該如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="FileMap" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\redirectmappings.txt" />
                <add key="IgnoreCase" value="1" />
                <add key="Separator" value="," />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="FileMapProviderTest" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{FileMap:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
        </rule>
    </rules>
</rewrite>

此規則會執行 HTTP 重新導向至透過 FileMapProvider 從文字檔取得的 URL。 名為 「FileMap」 的 FileMapProvider 實例會從規則的條件叫用,如果從提供者傳回的結果不是空的,則會執行 HTTP 重新導向。

若要測試規則開啟網頁瀏覽器,並要求 http://localhost/old/catalog/product.htmlhttp://localhost/old/contactus/index.html。 請注意,瀏覽器會根據redirectmappings.txt檔案中定義的重新導向對應,重新導向至新的URL。 網頁伺服器會針對重新導向的 URL 傳回 HTTP 404 錯誤,因為伺服器上沒有這類檔案或目錄,但這與本逐步解說的目的無關。 重要的是,網頁伺服器會根據使用 FileMapProviders 的規則發出重新導向回應。

使用 FileContainsProvider

FileContainsProvider 會從文本檔讀取字串集,然後檢查提供者的輸入字串是否包含任何字串做為子字串。 提供者可用於重寫規則,以根據使用者代理程式標頭封鎖存取。

建立不允許的使用者代理程式檔案範例

在網站的根目錄中建立名為 App_Data 的新目錄。 在該目錄中,建立名為 disalloweduseragents.txt 的文本檔。 將下列幾行新增至 檔案:

badrobot1
badrobot2

警告符號的影像會出現在警告附註之前。影像是中間有驚嘆號的三角形。警告: 請務必確定無法直接從 Web 存取文字檔。 使用 IIS 要求篩選模組或將檔案放在 App_Data資料夾內,以防止 HTTP 用戶端直接存取此檔案的內容。

設定 FileContainsProvider

依照設定 DbProvider 中所述 的相同步驟來設定 FileMapProvider。 針對提供者設定使用這些值:

  • FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt (請注意檔案路徑中的 {DOCUMENT_ROOT} 用法。這會取代為提供者初始化期間的實際路徑。當您不想在 web.config 檔案中放置絕對檔案路徑時,這會很有用。
  • IgnoreCase:1

從重寫規則呼叫 FileContainsProvider

在網站的根目錄中,開啟 web.config 檔案。 如果您使用 IIS 預設網站,則檔案應該位於 C:\inetpub\wwwroot\ 資料夾中。

將下列重新導向規則貼到 元素內的 /<configuration>/<system.webServer>/<rewrite>/<rules> web.config 檔案中:

<rule name="FileContainsProviderTest" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
    </conditions>
    <action type="AbortRequest" />
</rule>

web.config 檔案的完整內容應該如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="FileContains" type="FileContainsProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt" />
                <add key="IgnoreCase" value="1" />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="FileContainsProviderTest" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
            </conditions>
            <action type="AbortRequest" />
        </rule>
    </rules>
</rewrite>

如果 HTTP 要求的使用者代理程式符合disalloweduseragents.txt檔案中所列的任何字串,則此規則會中止 HTTP 連線。 名為 「FileContains」 的 FileContainsProvider 實例會從規則的條件叫用,如果提供者傳回的結果不是空的,則會中止 HTTP 連線。

若要測試規則開啟 WFetch,並將使用者代理程式標頭新增至要求,如下所示:

user-agent: badrobot1\r\n

從 WFetch 向 提出要求 http://localhost/test/。 您應該會看到連線已中止,因為使用者代理程式字串符合 disalloweduseragents.txt 檔案中的其中一個字元串。

w 擷取一個對話框頁面的螢幕快照。線上已中止,因為使用者代理程式字串符合不允許的使用者代理程式點 t x t 檔案中的其中一個字串。