首先來看一下 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>