1. 程式人生 > >Nginx Rewrite

Nginx Rewrite

概述 示例 htm 返回 root 規則 路徑名 index 優先級

Nginx Rewrite

Rewrite基本概述

1.什麽是rewrite
RewriteURL重寫, 主要實現url地址重寫, 以及重定向, 就是把傳入Web的請求重定向到其他URL的過程。

2.Rewrite使用場景

1.URL地址跳轉,例如用戶訪問bgx.com將其跳轉到xuliangwei.com , 或者當用戶通過http的方式訪問bgx.com時,將其跳轉至https的方式訪問bgx.com
2.URL偽靜態, 將動態頁面顯示為靜態頁面方式的一種技術, 便於搜索引擎的錄入, 同時減少動態URL地址對外暴露過多的參數, 提升更高的安全性。
3.搜索引擎SEO優化依賴於url路徑, 以便支持搜索引擎錄入

Rewrite配置語法

Rewrite示例

Syntax: rewrite regex replacement [flag];
Default: --
Context: server, location, if

在匹配過程中可以引用一些Nginx的全局變量

$document_root 針對當前請求的根路徑設置值;
$host 請求信息中的"Host",如果請求中沒有Host行,則等於設置的服務器名;
$request_filename 當前請求的文件路徑名(帶網站的主目錄/code/images/test.jpg)
$request_uri 當前請求的文件路徑名(不帶網站的主目錄/images/test.jpg)
$scheme用的協議,比如http或者https

Rewrite匹配優先級

1.執行server塊的rewrite指令
2.執行location匹配
3.執行選定的location中的rewrite

例1:用戶訪問/abc/1.html實際上真實訪問是/ccc/bbb/2.html

#http://www.bgx.com/abc/1.html ==> http://www.bgx.com/ccc/bbb/2.html

//1.準備真實的訪問路徑
[root@web03 ~]# mkdir /code/ccc/bbb -p
[root@web03 ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html

//2.Nginx跳轉配置
[root@web03 conf.d]# cat ccbb.conf 
server {
    listen 80;

    location / {
        root /code;
        index index.html;
    }
    location /abc {
        rewrite (.*) /ccc/bbb/2.html redirect;
        #return 302 /ccc/bbb/2.html;
    }
}
[root@web03 ~]# systemctl restart nginx

例2:用戶訪問/2018/ccc/bbb/2.html實際上真實訪問是/2014/ccc/bbb/2.html

#http://www.bgx.com/2018/ccc/bbb/2.html ==> http://www.bgx.com/2014/ccc/bbb/2.html

//1.準備真實的訪問路徑
[root@web03 ~]# mkdir /code/2014/ccc/bbb -p
[root@web03 ~]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html

//2.Nginx跳轉配置
[root@web03 conf.d]# cat ccbb.conf 
server {
    listen 80;
    location / {
        root /code;
        index index.html;
    }
    location /2018 {
        rewrite ^/2018/(.*)$ /2014/$1 redirect;
    }
}
[root@web03 ~]# systemctl restart nginx

例3:用戶訪問/test目錄下任何內容, 實際上真實訪問是http://www.xuliangwei.com

location /test {
    rewrite (.*) http://www.xuliangwei.com redirect;
}

例4:用戶訪問course-11-22-33.html實際上真實訪問是/course/11/22/33/course_33.html

#http://www.bgx.com/course-11-22-33.html ==> http://www.bgx.com/course/11/22/33/course_33.html  

//1.準備真實的訪問路徑
[root@web03 ~]# mkdir /code/course/11/22/33/ -p
[root@web03 ~]# echo "Curl docs.etiantian.org" > /code/course/11/22/33/course_33.html

//2.Nginx跳轉配置
[root@web03 conf.d]# cat ccbb.conf 
server {
        listen 80;
        root /code;
        index index.html;
        location / {
                #靈活
            rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
                #固定
            #rewrite ^/course-(.*)  /course/11/22/33/course_33.html redirect;
        }
[root@web03 ~]# systemctl restart nginx

例5:將http請求,跳轉至https

server {
        listen 80;
        server_name bgx.com;
        rewrite ^(.*) https://$server_name$1 redirect;
        #return 302 https://$server_name$request_uri;
}

server {
    listen 443;
    server_name bgx.com;
    ssl on;
}

Rewrite標記Flag

rewrite指令根據表達式來重定向URI, 或者修改字符串。 可以應用於server,location, if環境下, 每行rewrite指令最後跟一個flag標記,支持的flag標記有如下表格所示:

flag    
last         本條規則匹配完成後,繼續向下匹配新的location URI規則
break        本條規則匹配完成後,停止匹配,不在匹配後面的規則

redirect     返回302臨時重定向, 地址欄會顯示跳轉後的地址
permanent    返回301永久重定向, 地址欄會顯示跳轉後的地址

對比flag中break與last

公司目前產品有一個url地址是www.oldboy.com/2017_old隨著時間的推移, 
公司希望客戶通過新的url訪問www.oldboy.com/2019_new需要保證瀏覽器的url地址不發生變化
    [root@m01 ~]# cat /etc/nginx/conf.d/rewrite.conf
    server {
        listen 80;
        server_name www.oldboy.com;
        root /code;
        rewrite_log on;

        location ~ ^/2019_new {
            rewrite ^/2019_new /2017_old/ break;
        }
        location ~ ^/2020_new {
            rewrite ^/2020_new /2017_old/ last;
        }
        location ~ ^/2017_old {
            root /code;
            index index.html;
        }
    }

    #
    [root@m01 conf.d]# mkdir /code/2017_old
    [root@m01 conf.d]# echo "2017_old" > /code/2017_old/index.html

lastbreak對比總結:

last
1.last進行Rewrite匹配成功, 停止當前這個請求, 並根據rewrite匹配的規則重新向Server發起一個請求。
2.新請求的內容是域名+URL, 對應的地址為www.oldboy.com/2017_old

break
1.break進行Rewrite匹配成功後, 不會像last重新發起請求, 首先查找站點目錄下/code/2017_old/默認返回頁是否存在, 如不存在則404, 如存在繼續往下匹配
2.根據Rewrite匹配的規則, 跳轉至www.oldboy.com/2017_old/的URL地址, 匹配成功後則不繼續匹配

對比flagredirectpermanent

[root@Nginx ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
    listen 80;
    server_name localhost;
    root /soft/code;

location ~ ^/bgx {
    rewrite  http://kt.xuliangwei.com redirect;
    rewrite  http://kt.xuliangwei.com permanent;
    #return 301 http://kt.xuliangwei.com;
    #return 302 http://kt.xuliangwei.com;
}

Nginx Rewrite