Nginx Rewrite php
Rewirte 規則也稱爲規則重寫,主要功能是實現瀏覽器訪問 HTTP URL 的跳轉,其正則html
表達式是基於 Perl 語言。一般而言,幾乎全部的 WEB 服務器都可以支持 URL 重寫。Rewritenginx
URL 規則重寫的用途:瀏覽器
對搜索引擎優化(Search Engine Optimization,SEO)友好,利於搜索引擎抓取網站頁面;緩存
隱藏網站 URL 真實地址,瀏覽器顯示更加美觀;服務器
網站變動升級,能夠基於 Rewrite 臨時重定向到其餘頁面。優化
Nginx Rewrite 規則使用中有三個概念須要理解,分別是:Rewrite 結尾標識符、Rewrite網站
規則經常使用表達式、Nginx Rewrite 變量,以下爲三個概念的詳解:搜索引擎
(1) Nginx Rewrite 結尾標識符,用於 Rewrite 規則末尾,表示規則的執行屬性。spa
last :至關於 Apache 裏的(L)標記,表示完成 rewrite 匹配;
break:本條規則匹配完成後,終止匹配,再也不匹配後面的規則。
redirect:返回 302 臨時重定向,瀏覽器地址會顯示跳轉後的 URL 地址。
permanent:返回 301 永久重定向,瀏覽器地址欄會顯示跳轉後的 URL 地址。
其中 last 和 break 用來實現 URL 重寫時,瀏覽器地址欄 URL 地址不變。
2) Nginx Rewrite 規則經常使用表達式,主要用於匹配參數、字符串及過濾設置。
. |
|
匹配任何單字符; |
[word] |
|
匹配字符串:word; |
[^word] |
|
不匹配字符串:word; |
jfedu|jfteach |
可選擇的字符串:jfedu|jfteach; |
|
? |
|
匹配 0 到 1 個字符; |
* |
|
匹配 0 到多個字符; |
+ |
|
匹配 1 到多個字符; |
^ |
|
字符串開始標誌; |
$ |
|
字符串結束標誌; |
\n |
|
轉義符標誌。 |
|
|
|
(3) |
Nginx Rewrite 變量,經常使用於匹配 HTTP 請求頭信息、瀏覽器主機名、URL 等。 |
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST,
HTTP_ACCEPT;
connection & request: REMOTE_ADDR, QUERY_STRING;
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;
system stuff: TIME_YEAR, TIME_MON, TIME_DAY。
詳解以下:
HTTP_USER_AGENT 用戶使用的代理,例如瀏覽器;
HTTP_REFERER 告知服務器,從哪一個頁面來訪問的;
HTTP_COOKIE 客戶端緩存,主要用於存儲用戶名和密碼等信息;
HTTP_HOST 匹配服務器 ServerName 域名;
HTTP_ACCEPT 客戶端的瀏覽器支持的 MIME 類型;
REMOTE_ADDR 客戶端的 IP 地址
QUERY_STRING URL 中訪問的字符串;
DOCUMENT_ROOT 服務器發佈目錄;
SERVER_PORT 服務器端口;
SERVER_PROTOCOL 服務器端協議;
TIME_YEAR 年;
TIME_MON |
月; |
|
TIME_DAY |
日; |
|
|
|
|
(4) |
Nginx Rewrite 如下配置均配置在 nginx.conf 或者 vhosts.conf 中,企業中經常使用的 |
Nginx Rewrite 案例以下:
1. 將 baidu.com 跳轉至 ww.baidu.com。
if ($host = 'jfedu.net' ) {
rewrite ^/(.*)$ ww.baidu.com permanent;
}
rewrite ^/$ http://www.baidu.com/new_index.html permanent;
2.訪問/baidu/test01/跳轉至/newindex.html,瀏覽器地址不變。
rewrite ^/test01/$ http://www.baidu/newindex.htmil last;
3.多域名跳轉到 www.baidu.com。
if ($host != ‘www.baidu.com’ ) {
rewrite ^/(.*)$ http://www.baidu.com/$1 permanent;
}
4. 訪問文件和目錄不存在跳轉至 index.php。
if ( !-e $request_filename )
{
rewrite ^/(.*)$ /index.php last;
}
5.目錄對換 /xxxx/123456 ====> /xxxx?id=123456。
rewrite ^/(.+)/(\d+) /$1?id=$2 last;
6.判斷瀏覽器 User Agent 跳轉。
if( $http_user_agent ~ MSIE)
{
rewrite ^(.*)$ /ie/$1 break;
}
7.禁止訪問以.sh,.flv,.mp3 爲文件後綴名的文件。
location ~ .*\.(sh|flv|mp3)$
{
return 403;
}
9.將移動用戶訪問跳轉至移動端。
if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" )
{
rewrite ^/$ http://m.baidu.net/ permanent;
}
10. 匹配 URL 訪問字符串跳轉。
if ($args ~* tid=13) { return 404;
}
11.訪問/10690/baidu/123 跳轉至/index.php?tid/10690/items=123,[0-9]表示任意一個數字,+ 表示多個,(.+)表示任何多個字符。
rewrite ^/([0-9]+)/baidu/(.+)$ /index.php?tid/$1/items=$2 last;