IIS-URL重寫模塊配置參考


本文提供了URL重寫模塊的概述,並解釋了該模塊使用的配置概念。


功能概述
URL重寫模塊將請求URL重寫為顯示給用戶或Web應用程序的簡單,用戶友好和搜索引擎友好的地址。URL重寫使用定義的規則進行評估,然后將請求URL映射到規則中定義的地址,然后再由IIS Web服務器對其進行處理。您可以定義包括正則表達式和通配符的URL重寫邏輯,並且可以基於請求URL,HTTP標頭和服務器變量來應用規則。該模塊的主要目的是將請求URL重寫為更友好的URL,但是您也可以使用該模塊來定義執行重定向,發送自定義響應或中止請求的規則。


重寫規則概述
重寫規則定義了將請求URL與之進行比較或匹配的邏輯,以及在比較成功后該怎么做的邏輯。

重寫規則包括以下部分:

模式 –規則模式用於指定用於匹配URL字符串的正則表達式或通配符模式。
條件 –可選條件集合用於指定URL字符串與規則模式匹配時要執行的其他邏輯操作。在這些條件下,您可以檢查HTTP標頭或服務器變量的某些值,或驗證請求的URL是否對應於物理文件系統上的文件或目錄。
動作 –動作用於指定如果URL字符串與規則模式匹配且所有規則條件均得到滿足,該怎么辦。

重寫規則范圍
可以在兩個不同的集合中定義重寫規則:

<globalRules>–此集合中的規則只能在服務器級別上定義。全局規則用於定義服務器范圍的URL重寫邏輯。這些規則在ApplicationHost.config文件中定義,並且不能在任何較低的配置級別上覆蓋或禁用它們。全局規則始終在絕對URL的路徑上運行(即,所請求的URI不帶服務器名稱)。這些規則在IIS請求處理管道(PreBeginRequest事件)的早期進行評估。
<rules>–此集合中的規則稱為分布式規則,可以在配置層次結構的任何級別上定義它們。分布式規則用於定義特定於特定配置范圍的URL重寫邏輯。可以使用Web.config文件或<location>ApplicationHost.config或Web.config文件中的標記在任何配置級別上添加這種類型的規則。相對於定義它們的Web.config文件的位置,分布式規則在URL路徑上運行。如果在<location>標簽內部定義了分布式規則,則它們將在URL路徑(相對於為該<location>標簽指定的路徑)上運行。這些規則在IIS管道中的BeginRequest事件上進行評估。

規則評估
IIS中的每個配置級別都可以定義零個或多個重寫規則。規則以指定順序進行評估。URL重寫模塊通過使用以下算法來處理規則集:

首先,URL與規則模式匹配。如果不匹配,URL重寫模塊將立即停止處理該規則,並繼續執行下一個規則。
如果模式匹配且該規則沒有條件,則URL重寫模塊將執行為此規則指定的操作,然后繼續執行下一個規則,在該規則中它將替換的URL用作該規則的輸入。
如果模式匹配且規則存在條件,則URL重寫模塊將評估條件。如果評估成功,則執行指定的規則操作,然后將重寫的URL用作后續規則的輸入。
規則可能已啟用StopProcessing標志。當執行規則操作(即匹配規則)並且打開此標志時,這意味着將不再處理后續的規則,並且該請求將被傳遞到IIS請求管道。默認情況下,此標志是關閉的。


規則繼承
如果在多個配置級別上定義了規則,則URL重寫模塊將按以下順序評估規則:

評估所有全局規則。
評估一個規則集,其中包括來自父配置級別的分布式規則以及來自當前配置級別的規則。評估以父子順序執行,這意味着首先評估父規則,最后評估在最后一個子級別定義的規則。

保留原始URL
URL重寫模塊在以下服務器變量中保留了原始請求的URL路徑:

HTTP_X_ORIGINAL_URL –此服務器變量包含解碼格式的原始URL;
UNENCODED_URL –此服務器變量包含與Web客戶端完全相同的原始URL,並保留了所有原始編碼。

通過重寫規則訪問URL部件
重要的是要了解如何從重寫規則訪問URL字符串的某些部分。

對於以下形式的HTTP URL:http(s):// <主機>:<端口> / <路徑>?<查詢字符串>

<path>與規則的模式匹配。
<querystring>在名為QUERY_STRING的服務器變量中可用,並且可以使用規則中的條件進行訪問。
<host>在服務器變量HTTP_HOST中可用,並且可以通過使用規則中的條件進行訪問。
<port>在服務器變量SERVER_PORT中可用,並且可以使用規則中的條件進行訪問。
服務器變量SERVER_PORT_SECURE和HTTPS可用於確定是否使用了安全連接。可以通過使用規則中的條件來訪問這些服務器變量。
服務器變量REQUEST_URI可用於訪問整個請求的URL路徑,包括查詢字符串。
例如,如果請求此URL http://www.mysite.com/content/default.aspx?tabid=2&subtabid=3:,並且在網站級別定義了重寫規則,則:

規則模式將URL字符串content/default.aspx作為輸入。
QUERY_STRING服務器變量包含tabid=2&subtabid=3。
HTTP_HOST服務器變量包含www.mysite.com。
SERVER_PORT服務器變量包含80。
服務器變量SERVER_PORT_SECURE包含,0而HTTPS包含OFF。
REQUEST_URI服務器變量包含/content/default.aspx?tabid=2&subtabid=3。
PATH_INFO服務器變量包含/content/default.aspx。
請注意,傳遞給分布式規則的輸入URL字符串始終與定義規則的Web.config文件的位置有關。例如,如果請求http://www.mysite.com/content/default.aspx?tabid=2&subtabid=3,並且在/ content目錄中定義了重寫規則,則該規則將獲取此URL字符串default.aspx作為輸入。


重寫規則配置

規則模式
重寫規則模式用於指定與當前URL路徑進行比較的模式。在這種情況下,當前是指應用規則時URL路徑的值。如果當前規則之前有任何規則,則它們可能已經與原始請求的URL匹配並進行了修改。根據模式評估的URL字符串不包括查詢字符串。要將查詢字符串包括在規則評估中,可以在規則的條件中使用QUERY_STRING服務器變量。有關更多信息,請參閱“在重寫規則中使用服務器變量”。

在重寫規則的<match>元素內指定了模式。


規則模式語法
可以使用規則的patternSyntax屬性指定規則模式語法。可以將此屬性設置為以下選項之一:

ECMAScript – Perl兼容(符合ECMAScript標准)正則表達式語法。這是任何規則的默認選項。這是模式格式的示例:“ ^([_ 0-9a-zA-Z-]-//)?(wp-。*)”

通配符 – IIS HTTP重定向模塊中使用的通配符語法。以下是這種格式的示例:“ / Scripts / * _ in。???”,其中星號(“ *”)表示“匹配任意數量的任何字符並在向后引用中捕獲它們”和“ ?表示完全匹配一個字符(不創建反向引用)。

patternSyntax屬性的范圍是每個規則的范圍,這意味着它適用於當前規則的模式以及該規則條件內使用的所有模式。


規則模式屬性
可以通過使用<match>元素的negate屬性來否定模式。使用此屬性時,僅當當前URL 與指定的模式不匹配時,才執行規則操作。

默認情況下,使用不區分大小寫的模式匹配。要啟用區分大小寫,可以使用規則的<match>元素的ignoreCase屬性。


規則條件
規則條件允許為規則評估定義其他邏輯,這些邏輯可以基於輸入,而不僅僅是當前URL字符串。任何規則都可以具有零個或多個條件。規則模式匹配成功后,將評估規則條件。

條件是在重寫條件的<conditions>集合中定義的。該集合具有一個稱為logicalGrouping的屬性,該屬性控制如何評估條件。如果規則有條件,則僅在匹配規則模式且滿足以下條件時才執行規則操作:

前提是使用的是logicalGrouping =“ MatchAll”,所有條件均被評估為true 。
前提條件是至少有一個條件為true,前提是使用了logicalGrouping =“ MatchAny”。
通過指定以下屬性來定義條件:

輸入字串
比賽類型
條件輸入指定將哪個項目用作條件評估的輸入。條件輸入是一個任意字符串,可以包括服務器變量和對先前條件模式和/或規則模式的反向引用。

匹配類型可以是以下三個選項之一:

IsFile –此匹配類型用於確定輸入字符串是否包含文件系統上文件的物理路徑。如果未指定條件輸入字符串,則URL重寫模塊會將請求文件的物理路徑用作條件輸入的默認值。此匹配類型只能用於分布式規則。
IsDirectory –此匹配類型用於確定輸入字符串是否包含文件系統上目錄的物理路徑。如果未指定條件輸入字符串,則URL重寫模塊會將請求文件的物理路徑用作條件輸入的默認值。此匹配類型只能用於分布式規則。
模式 -此匹配類型用於表示條件,其中任意輸入字符串與正則表達式模式匹配。可以使用正則表達式語法或通配符語法來指定條件模式。條件中使用的模式類型取決於為此條件所屬的規則定義的patternSyntax標志的值。此條件類型具有控制模式匹配的兩個相關屬性:

pattern –使用此屬性可以指定實際的模式。
ignoreCase –使用此屬性來控制條件的模式匹配是區分大小寫還是不區分大小寫。
另外,可以通過使用negate屬性來否定條件評估的結果。這可以用於指定一個條件,該條件檢查所請求的URL是否不是文件,如以下示例所示:

XML格式

復制
<add input="{REQUEST_FILENAME}" matchType="isFile" negate="true">

規則動作
當當前URL匹配規則模式並且條件評估成功時(取決於規則配置,所有條件匹配還是任何一個或多個條件匹配),將執行重寫規則操作。有幾種類型的操作可用,<action>配置元素的type屬性可用於指定規則執行的操作。以下各節描述了不同的操作類型以及與特定操作類型相關的配置選項。


重寫動作
一個重寫的動作替換當前URL字符串替換字符串。替換字符串必須始終指定URL路徑(例如contoso / test / default.aspx)。請注意,C:\inetpub\wwwrootIIS不支持包含文件系統上的物理路徑的替換(例如,)。

一個重寫的動作有以下配置選項:

url –這是重寫當前URL時要使用的替換字符串。替換URL是一個字符串值,可以包含以下內容:

對條件和規則模式的反向引用。(有關更多信息,請參見有關如何使用反向引用的部分。)
服務器變量。(有關更多信息,請參見有關如何使用服務器變量的部分。)
appendQueryString –指定在替換過程中是否保留當前URL的查詢字符串。默認情況下,如果未指定appendQueryString標志的值,則假定它為TRUE。這意味着來自原始URL的查詢字符串將附加到替代URL。

重定向動作
一個重定向操作指示的URL重寫模塊發送重定向響應返回給客戶端。可以將重定向狀態代碼(3xx)指定為該操作的參數。響應的“ 位置”字段包含規則中指定的替換字符串。

可以使用以下格式之一指定重定向規則的替換URL:

相對URL路徑– contoso / test / default.aspx
絕對URI – https://example.com/contoso/test/default.aspx
使用重定向操作意味着執行重定向后,不會為當前URL評估任何后續規則。

一個重定向操作具有以下配置選項:

url –使用替代字符串作為重定向URL。替換URL是可以包括以下內容的字符串:

對條件和規則模式的反向引用。(有關更多信息,請參見有關如何使用反向引用的部分。)
服務器變量。(有關更多信息,請參見有關如何使用服務器變量的部分。)
appendQueryString –指定在替換期間是否應保留當前URL的查詢字符串。默認情況下,如果未指定AppendQueryString標志,則假定它為TRUE。這意味着來自原始URL的查詢字符串將附加到替代URL。
redirectType –指定重定向期間要使用的狀態代碼:

301 –永久
302 –找到
303 –其他
307 –臨時

CustomResponse操作
甲CustomResponse動作通過使用用戶指定的狀態碼,子碼,和原因導致URL重寫模塊向HTTP客戶端響應。使用CustomResponse操作意味着執行此操作后,不會為當前URL評估任何后續規則。

CustomResponse操作具有以下配置選項:

statusCode –指定用於響應客戶端的狀態碼。
subStatusCode –指定用於響應客戶端的子狀態代碼。
statusReason –指定要與狀態代碼一起使用的原因短語。
statusDescription –指定要放入響應正文中的一行描述。

AbortRequest操作
一個AbortRequest動作導致URL重寫模塊放棄對當前請求的HTTP連接。該動作沒有任何參數。使用此操作意味着執行此操作后,不會為當前URL評估任何后續規則。


無動作
一個無動作用於指定不執行任何操作。


在重寫規則中使用服務器變量
服務器變量提供有關當前HTTP請求的其他信息。您可以使用此信息來做出重寫決定或編寫重寫的URL。可以在重寫規則中的以下位置引用服務器變量:

在條件輸入字符串中
在規則替換字符串中,特別是:

重寫和重定向操作的url屬性
狀態行和responseLine一個的CustomResponse行動
可以使用{VARIABLE_NAME}語法引用服務器變量。例如,以下條件使用QUERY_STRING服務器變量:

XML格式

復制
<add input="{QUERY_STRING}" pattern="id=([0-9]+)" />
服務器變量還可以用於從當前請求訪問HTTP標頭。當前請求提供的任何HTTP標頭都表示為服務器變量,該服務器變量具有根據以下命名約定生成的名稱:

HTTP標頭名稱中的所有破折號(“-”)都將轉換為下划線符號(“ _”)。
HTTP標頭名稱中的所有字母都將轉換為大寫字母。
標頭名稱中將添加“ HTTP_”前綴。
例如,為了從重寫規則訪問HTTP標頭“用戶代理”,可以使用{HTTP_USER_AGENT}服務器變量。


在重寫規則中使用反向引用
規則或條件輸入的一部分可以在反向引用中捕獲。然后,可以將它們用於在規則操作內構造替換URL或為規則條件構造輸入字符串。

反向引用的生成方式不同,具體取決於規則使用哪種模式語法。使用ECMAScript模式語法時,可以通過在模式中必須捕獲反向引用的部分周圍加上括號來創建反向引用。例如,圖案。([0-9] +)/([AZ] +)的html將捕獲07和物品從該請求的URL反向引用:07 / article.html。當使用“通配符”模式語法時,在模式中使用星號(*)時始終創建向后引用。當“?”時,不會創建反向引用。在模式中使用。例如,模式* / *。html將捕獲contoso並進行測試在此請求的URL的反向引用中:contoso / test.html。

不管使用哪種模式語法捕獲反向引用,其用法都是相同的。可以在重寫規則中的以下位置使用反向引用:

條件輸入字符串
在規則操作中,特別是:

重寫和重定向操作的url屬性
狀態行和responseLine一個的CustomResponse行動
在重寫映射的關鍵參數中
對條件模式的后向引用由{C:N}標識,其中N為0到9。對規則模式的后向引用由{R:N}標識,其中N為0到9。請注意,對於兩種類型的向后引用{R:0}和{C:0}將包含匹配的字符串。

例如,在這種模式下:

安慰

復制
^(www\.)(.*)$
對於字符串:www.foo.com反向引用的索引如下:

JSON格式

復制
{C:0} - www.foo.com
{C:1} - www.
{C:2} - foo.com
在規則操作中,可以使用對規則模式和該規則的最后匹配條件的反向引用。在條件輸入字符串中,您可以使用對規則模式和先前匹配條件的反向引用。

以下規則示例演示了如何創建和引用反向引用:

XML格式

復制
<rule name="Rewrite subdomain">
<match url="^(.+)" /> <!-- rule back-reference is captured here -->
<conditions>
<add input="{HTTP_HOST}" type="Pattern" pattern="^([^.]+)\.mysite\.com$" /> <!-- condition back-reference is captured here -->
</conditions>
<action type="Rewrite" url="{C:1}/{R:1}" /> <!-- rewrite action uses back-references to condition and to rule when rewriting the url -->
</rule>

與IIS輸出緩存的交互
URL重寫模塊控制IIS輸出緩存行為,以便:

最佳利用響應的內核模式和用戶模式輸出緩存來重寫URL,從而提高使用URL重寫模塊的Web應用程序的性能。
當URL重寫可能違反緩存邏輯時,請防止響應緩存。
該模塊通過更改某些緩存屬性或完全禁用緩存來控制輸出緩存。如果該模塊已被IIS配置或IIS管道中的任何其他模塊禁用,則無法啟用輸出緩存。輸出緩存的控制如下:

該模塊始終設置用戶模式緩存設置VariantByHeader =“ HTTP_X_ORIGINAL_URL”。這樣可以確保在啟用用戶模式緩存時,模塊會考慮原始URL來構造用於緩存條目的鍵。
如果重寫規則集使用的服務器變量的值在整個過程的生命周期中都是恆定的,或者是從請求的URL派生的,則對於輸出緩存而言,規則集被認為是安全的。這意味着,URL重寫模塊將不會以設置步驟1中所述的方式設置alterByHeader以外的任何方式更改現有的緩存策略。

在重寫規則中使用以下服務器變量時,不會對輸出緩存策略產生任何影響:

“ CACHE_URL”
“ DOCUMENT_ROOT”
“ HTTP_URL”
“ HTTP_HOST”
“ PATH_INFO”
“ PATH_TRANSLATED”
“請求參數”
“ 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”
如果重寫規則集使用上面列表中未提及的任何服務器變量,則該規則集被視為對輸出緩存不安全。這意味着無論是否重寫了請求URL,URL重寫模塊都會為所有請求禁用內核模式緩存。此外,該模塊將通過設置高速緩存屬性variableByValue包含規則集中使用的所有服務器變量值的串聯字符串,來更改用戶模式高速緩存的高速緩存策略。


字符串函數
可以使用三種字符串函數來更改重寫規則操作中的值以及任何條件:

ToLower-返回轉換為小寫的輸入字符串。
UrlEncode-返回轉換為URL編碼格式的輸入字符串。如果重寫規則中的替換URL包含特殊字符(例如非ASCII或URI不安全字符),則可以使用此功能。
UrlDecode-解碼URL編碼的輸入字符串。此功能可用於在與模式匹配之前對條件輸入進行解碼。
可以使用以下語法來調用這些函數:

JSON格式

復制
{function_name:any_string}
其中“ function_name”可以位於以下各項中:“ ToLower”,“ UrlEncode”,“ UrlDecode”。“ Any_string”可以是文字字符串,也可以是使用服務器變量或反向引用構建的字符串。例如,以下是字符串函數的有效調用:

JSON格式

復制
{ToLower:DEFAULT.HTM}
{UrlDecode:{REQUEST_URI}}
{UrlEncode:{R:1}.aspx?p=[résumé]}
可以在重寫規則中的以下位置使用字符串函數:

條件輸入字符串
在規則替換字符串中,特別是:

重寫和重定向操作的url屬性
CustomResponse操作的statusLine和responseLine屬性
使用ToLower函數的規則示例:

XML格式

復制
<rule name="Redirect to canonical url">
<match url="^(.+)" /> <!-- rule back-reference is captured here -->
<conditions>
<!-- Check whether the requested domain is in canonical form -->
<add input="{HTTP_HOST}" type="Pattern" pattern="^www\.mysite\.com$" negate="true" />
</conditions>
<!-- Redirect to canonical url and convert URL path to lowercase -->
<action type="Redirect" url="http://www.mysite.com/{tolower:{R:1}}" RedirectType="Found" />
</rule>
使用UrlEncode函數的規則示例:

XML格式

復制
<rules>
<rule name="UrlEncode example" stopProcessing="true">
<match url="resume" />
<action type="Rewrite" url="default.aspx?name={UrlEncode:résumé}"/>
</rule>
使用UrlDecode函數的規則示例:

XML格式

復制
<rules>
<rule name="UrlDecode example">
<match url="default.aspx" />
<conditions>
<add input="{UrlDecode:{QUERY_STRING}}" pattern="résumé" />
</conditions>
<action type="Rewrite" url="default.aspx?type=resume" />
</rule>
</rules>

改寫地圖
重寫映射是名稱-值對的任意集合,可在重寫規則內使用它們在重寫期間生成替換URL。當您有大量的重寫規則並且所有這些規則都使用靜態字符串時(即未使用任何模式匹配時),重寫映射特別有用。在這些情況下,您可以定義輸入URL和替換URL之間的鍵和值,而不是定義大量簡單的重寫規則,而將所有映射放入重寫映射中。然后,要基於輸入URL查找替代URL,您將擁有一個引用重寫映射的重寫規則。

重寫映射定義了名稱-值對字符串的命名集合,如以下示例所示:

XML格式

復制
<rewriteMap name="MyRewriteMap" defaultValue="">
<add key="a.html" value="b.html" />
<add key="c.aspx" value="d.aspx" />
<add key="e.php" value="f.php" />
</rewriteMap>
重寫映射由其名稱唯一標識,並且可以包含零個或多個鍵值條目。此外,重寫映射可以指定找不到密鑰時要使用的默認值。這是通過使用defaultValue屬性控制的。默認情況下,空字符串用作默認值。

除文件級別外,任何配置級別上都可以有任意數量的重寫映射。重寫映射位於<rewriteMaps>集合元素內。

使用以下語法在重寫規則中引用了重寫映射:

JSON格式

復制
{RewriteMapName:Key}
其中Key參數可以是任何任意字符串,並且可以包括對規則或條件模式的反向引用。例如,以下是重寫映射的有效用法:

JSON格式

復制
{MyRewriteMap:contoso/{R:1}/test/{C:1}}
{MyRewriteMap:a.html}
{MyRewriteMap:{R:1}?{C:1}&contoso=test}
對重寫映射的引用將替換為通過使用作為重寫映射引用內的參數傳遞的鍵查找的值。如果未找到密鑰,則使用該重寫映射的默認值。

重寫地圖可重寫規則中的以下位置被引用:

條件輸入字符串
在規則替換字符串中,特別是:

重寫和重定向操作的url屬性
狀態行和responseLine的CustomResponse行動
示例1:重寫映射定義如下:

XML格式

復制
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRewrites" defaultValue="">
<add key="/diagnostics" value="/default.aspx?tabid=2&amp;subtabid=29" />
<add key="/webcasts" value="/default.aspx?tabid=2&amp;subtabid=24" />
<add key="/php" value="/default.aspx?tabid=7116" />
</rewriteMap>
</rewriteMaps>
</rewrite>
並且重寫規則定義如下:

XML格式

復制
<rewrite>
<rule name="Rewrite Rule">
<match url=".*" />
<conditions>
<add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}"/>
</rule>
</rewrite>
所請求的URL / 診斷將被重寫為/default.aspx?tabid=2&subtabid=29。
所請求的URL / 網絡廣播將被重寫為/default.aspx?tabid=2&subtabid=24。
所請求的URL / php將被重寫為/default.aspx?tabid=7116。
所請求的URL / default.aspx將不會被重寫,因為重寫映射不包含帶有key =“ / default.aspx”的元素;因此,重寫映射將返回與條件模式不匹配的空字符串,因此將不執行規則操作。

示例2:重寫映射定義如下:

XML格式

復制
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRedirects" defaultValue="">
<add key="/default.aspx?tabid=2&amp;subtabid=29" value="/diagnostics" />
<add key="/default.aspx?tabid=2&amp;subtabid=24" value="/webcasts" />
<add key="/default.aspx?tabid=7116" value="/php" />
</rewriteMap>
</rewriteMaps>
</rewrite>
並且重寫規則定義如下:

XML格式

復制
<rewrite>
<rule name="Redirect rule">
<match url=".*" />
<conditions>
<add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="http://www.contoso.com{C:1}" redirectType="Found" />
</rule>
</rewrite>
請求的URL /default.aspx?tabid=2&subtabid=29將重定向到http://www.contoso.com/diagnostics。
請求的URL /default.aspx?tabid=2&subtabid=24將被重定向到http://www.contoso.com/webcasts。
所請求的URL /default.aspx?tabid=7116將被重定向到http://www.contoso.com/php。
所請求的URL / default.aspx將不會被重定向,因為重寫映射不包含帶有key =“ / default.aspx”的元素;因此,重寫映射將返回與條件模式不匹配的空字符串,因此將不執行規則操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM