URL重寫有利于網站首選域的確定,對于同一資源頁面多條路徑的301重定向有助于URL權重的集中
1.Nginx URL重寫(rewrite)介紹
和apache等web服務軟件一樣,rewrite的組要功能是實現RUL地址的重定向。
Nginx的rewrite功能需要PCRE軟件的支持,即通過perl兼容正則表達式語句進行規則匹配的。
默認參數編譯nginx就會支持rewrite的模塊,但是也必須要PCRE的支持
2.rewrite語法格式及參數語法:
rewrite是實現URL重寫的關鍵指令,根據regex (正則表達式)部分內容,
重定向到replacement,結尾是flag標記。
rewrite <regex> <replacement> [flag];
關鍵字 正則 替代內容 flag標記
關鍵字:其中關鍵字error_log不能改變
正則:perl兼容正則表達式語句進行規則匹配
替代內容:將正則匹配的內容替換成replacement
flag標記:rewrite支持的flag標記
rewrite參數的標簽段位置:
server,location,if
flag標記說明:
last #本條規則匹配完成后,繼續向下匹配新的location URI規則
break #本條規則匹配完成即終止,不再匹配后面的任何規則
redirect #返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址
permanent #返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址
2.1nginx 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 日;
3.例子
3.0較難場景
第一種:
將uri中的所有空格替換為"_",連續的空格替換為一個"_"放到proxy_pass之前,
切記, 下述表達式中第一個括號后有空格
rewrite '^(\S+) +(\S+)(.*)' $1_$2$3 last;
3.1demo01
rewrite ^/(.*) http://www./$1 permanent;
說明:
rewrite為固定關鍵字,表示開始進行rewrite匹配規則。
regex部分是 ^/(.*) ,這是一個正則表達式,匹配完整的域名和后面的路徑地址。
replacement部分是http://www./$1。其中$1是取自regex部分()里的內容,匹配成功后跳轉到的URL。
flag部分 permanent表示永久301重定向標記,即跳轉到新的http://www./$1 地址上。
3.2demo02
vi編輯虛擬主機配置文件
vi conf/vhost/www.abc.com.conf
修改文件內容方法1
server {
listen 80;
server_name abc.com;
rewrite ^/(.*) http://www.abc.com/$1 permanent;
}
server {
listen 80;
server_name www.abc.com;
location / {
root /data/www/www;
index index.html index.htm;
}
error_log logs/error_www.abc.com.log error;
access_log logs/access_www.abc.com.log main;
}
修改文件內容方法2
server {
listen 80;
server_name abc.com www.abc.com;
if ( $host != 'www.abc.com' ) {
rewrite ^/(.*) http://www.abc.com/$1 permanent;
}
location / {
root /data/www/www;
index index.html index.htm;
}
error_log logs/error_www.abc.com.log error;
access_log logs/access_www.abc.com.log main;
}
if ($host = ' ) {
#其中$1是取自regex部分()里的內容,匹配成功后跳轉到的URL。
rewrite ^/(.*)$ http://www./$1 permanent;
}
rewrite ^/$ http://www.test.com/index01.html permanent;
3.5訪問/zy/test01/跳轉至/newindex.html,瀏覽器地址不變
rewrite ^/zy/test01/$ /newindex.html last;
3.6多域名跳轉到www.
if ($host != 'www.jfedu.net’ ) {
rewrite ^/(.*)$ http://www.zy.com/$1 permanent;
}
3.7訪問文件和目錄不存在跳轉至index.php
if ( ! -e $request_filename ) {
rewrite ^/(.*)$ /index.php last;
}
3.8目錄對換 /xxxx/123456 ====> /xxxx?id=123456
rewrite ^/(.+)/(\d+) /$1?id=$2 last;
3.9判斷瀏覽器User Agent跳轉
if( $http_user_agent ~ MSIE) {
rewrite ^(.*)$ /ie/$1 break;
}
3.10 禁止訪問以.sh,.flv,.mp3為文件后綴名的文件
location ~ .*\.(sh|flv|mp3)${
return 403;
}
3.11 將移動用戶訪問跳轉至移動端
if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ){
rewrite ^/$ http://m.jfedu.net/ permanent;
}
3.12 訪問/10690/zy/123跳轉至/index.php?tid/10690/items=123,[0-9]表示任意一個數字,+表示多個,(.+)表示任何多個字符__
rewrite ^/([0-9]+)/zy/(.+)$ /index.php?tid/$1/items=$2 last;
3.13匹配URL訪問字符串跳轉
if ($args ~* tid=13){
return 404;
}
4.rewrite 企業應用場景
>> 可以調整用戶瀏覽的URL,看起來更規范,合乎開發及產品人員的需求。
>> 為了讓搜索引擎搜錄網站內容及用戶體驗更好,企業會將動態URL地址偽裝成靜態地址提供服務。
>> 網址換新域名后,讓舊的訪問跳轉到新的域名上。例如,訪問京東的360buy.com會跳轉到jd.com
>> 根據特殊變量、目錄、客戶端的信息進行URL調整等
|