web.config 重寫規則詳解

首先來看一下 web.config 基本文件格式

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Rewrite" stopProcessing="true">
                    <match url="(.*)" ignoreCase="true" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php" />
                </rule>
                <rule name="Rewrite" stopProcessing="true">
                ...
                </rule>
        </rules>
        </rewrite>
    </system.webServer>
</configuration>

如果要添加多個規格,只需要添加 <rule>...</rule> 對就可以了

<match> 標籤爲規則模式,用於匹配 URL 字符串的正則表達式或通配符。

<conditions> 可選條件模式,如驗證請求的 URL 是否對應於物理文件系統上的文件或目錄。

如果這兩者模式任一個不滿足,URL 重寫模塊將立即停止處理該規則,並執行下一個規則,如果都匹配,就執行 <action> 動作,如果設置 stopProcessing="true",程序就會被終止,不再往下繼續了,爲 false 會繼續執行下一規則,stopProcessing 默認值爲 false。

請求的 URL 如何與規則模式匹配呢?

HTTP URL 請求字符串格式:http(s)://<host>:<port>/<path>?<querystring>

<host> 轉換爲 HTTP_HOST 服務器變量,在 <conditions> 條件模式中訪問

<port> 轉換爲 SERVER_PORT 服務器變量,在 <conditions> 條件模式中訪問

<path> 部分與 <match> 規則模式的 rul 屬性正則表達式進行匹配

<querystring> 轉換爲 QUERY_STRING 服務器變量,在 條件模式中訪問

http(s) :通過服務器變量 SERVER_PORT_SECURE 和 HTTPS 可判斷是否安全鏈接,當 HTTP 請求時,SERVER_PORT_SECURE 爲0,HTTPS 爲 OFF,否則爲 1 和 ON

服務器變量 REQUEST_URI 可用於訪問整個路徑,包括 <path> 和 <querystring>

ignoreCase 忽略大小寫,true 爲忽略

negate 是否匹配模式,爲 true 時, 當 URL 與指定模式不匹配時,才執行操作

logicalGrouping 條件滿足情況,如果爲 MatchAll ,所有條件都必須滿足,MatchAny 至少滿足一個條件

以下屬性來使用條件模式

  • input 匹配字符串
  • matchType 匹配類型

matchType 又分爲 3 中情況

  • IsFile 判斷是否爲實際的物理路徑文件,negate 爲 true,表示不是文件
  • IsDirectory 判斷請求的是否爲實際的物理路徑目錄,negate 爲 true,表示不是目錄
  • Pattern 使用正則表達式與 input 字符串匹配,需要添加 pattern 屬性使用正則

執行重定向動作,url 屬性爲重定向的路徑

  • name=”Rewrite” 重寫
  • name=”Redirect” 重定向
  • name=”CustomResponse” 自定義響應,發送 錯誤信息狀態碼
  • name=”AbortRequest” 終止請求

redirectType 爲 Redirect 指定狀態碼

  • 301 – Permanent 永久
  • 302 – Found 已找到
  • 303 – See other 參閱其他
  • 307 – Temporary 臨時

引用變量的使用

當 URL 與規則模式正則匹配時,匹配結果會生成引用變量,例子說明

<add input="{HTTP_HOST}" pattern="^(www\.)(.*)$" />

如果字符串是:www.tianlunvip.com 會產生以下引用變量索引

{C:0} - www.tianlunvip.com
{C:1} - www.
{C:2} - tianlunvip.com

對條件模式的後向引用用 {C:N} 標識,對規則模式的後向引用用 {R:N} 標識,其中 N 爲 0 到 9

其它可用服務器變量

  • {CACHE_URL}
  • {DOCUMENT_ROOT}
  • {HTTP_URL}
  • {HTTP_HOST}
  • {PATH_INFO}
  • {PATH_TRANSLATED}
  • {QUERY_STRING}
  • {REQUEST_FILENAME}
  • {REQUEST_URI}
  • {SCRIPT_FILENAME}
  • {SCRIPT_NAME}
  • {SCRIPT_TRANSLATED}
  • {UNENCODED_URL}
  • {URL}
  • {URL_PATH_INFO}
  • {APP_POOL_ID}
  • {APPL_MD_PATH}
  • {APPL_PHYSICAL_PATH}
  • {GATEWAY_INTERFACE}
  • {SERVER_SOFTWARE}
  • {SSI_EXEC_DISABLED}
  • {HTTP_USER_AGENT}

實戰例子

1、將 HTTP 的鏈接重定向到 HTTTS 安全鏈接

<rule name="301" stopProcessing="true">
    <match url="^(.*)$" ignoreCase="false" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTPS}" pattern="^ON$" negate="true" />
    </conditions>
    <action type="Redirect" url="https://www.tianlunvip.com/{R:1}" redirectType="Permanent" />
</rule>

2、將 www.foo.com 域名重定向到 www.tianlunvip.com

<rule name="301" stopProcessing="true">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAny">
        <add input="{HTTP_HOST}" pattern="^www.foo.com$" />
    </conditions>
    <action type="Redirect" url="https://www.tianlunvip.com/{R:0}" redirectType="Permanent" />
</rule>

3、用短鏈接替代真實鏈接地址

<rule name="Rewrite" stopProcessing="true">
    <match url="^post\/(.*)$" ignoreCase="false" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
    </conditions>
    <action type="Rewrite" url="post/index.php?p={R:2}" />
</rule>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章