天天看點

Nginx系列教程(7)nginx rewrite配置規則詳細說明

Nginx系列教程(7)nginx rewrite配置規則詳細說明

Rewite 規則作用

Rewrite規則可以實作對url的重寫,以及重定向

作用場景

URL通路跳轉,支援開發設計,如頁面跳轉,相容性支援,展示效果等

SEO優化

維護:背景維護、流量轉發等

安全

注:nginx官方文檔:

http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

配置文法

Syntax: rewrite regex replacement [flag];

Default:——

Context:server、location、if

rewrite文法

server {
    rewrite {規則} {定向路徑} {重寫類型} ;
}           

1、規則:可以是字元串或者正則來表示想比對的目标url

2、定向路徑:表示比對到規則後要定向的路徑,如果規則裡有正則,則可以使用$index來表示正則裡的捕獲分組

3、重寫類型:

last :相當于Apache裡德(L)标記,表示完成rewrite,浏覽器位址欄URL位址不變。停止rewrite檢測【如果沒有比對到,會繼續向下比對】

break;本條規則比對完成後,終止比對,不再比對後面的規則,浏覽器位址欄URL位址不變。停止rewrite檢測【如果沒有比對到,則不再向下比對,直接傳回結果404】

redirect:傳回302臨時重定向,浏覽器位址會顯示跳轉後的URL位址。

permanent:傳回301永久重定向,浏覽器位址欄會顯示跳轉後的URL位址permanent:傳回301永久重定向,浏覽器位址欄會顯示跳轉後的URL位址

簡單執行個體

rewrite ^(.*)$ /pages/maintain.html break;           

解釋說明:

會把所有的請求都重定向到 /pages/maintain.html 頁面。

last和break的差別:

  1. 因為301和302不能簡單的隻傳回狀态碼,還必須有重定向的URL,這就是return指令無法傳回301,302的原因了(return 隻能傳回除301、302之外的code)。
  2. last一般寫在server和if中,而break一般使用在location中

    3.last不終止重寫後的url比對,即新的url會再從server走一遍比對流程,而break終止重寫後的比對

4.break和last都能組織繼續執行後面的rewrite指令

  1. 在location裡一旦傳回break則直接生效并停止後續的比對location
server {
        location / {
            rewrite /last/ /q.html last;
            rewrite /break/ /q.html break;
        }
        location = /q.html {
            return 400;
        }
    }
           

通路/last/時重寫到/q.html,然後使用新的uri再比對,正好比對到locatoin = /q.html然後傳回了400;

通路/break時重寫到/q.html,由于傳回了break,則直接停止了;

常用的正規表達式

Nginx系列教程(7)nginx rewrite配置規則詳細說明

案例說明

簡單舉例說明

server {
    rewrite /last.html /index.html last;
    # 通路 /last.html 的時候,頁面内容重寫到 /index.html 中

    rewrite /break.html /index.html break;
    # 通路 /break.html 的時候,頁面内容重寫到 /index.html 中,并停止後續的比對

    rewrite /redirect.html /index.html redirect;
    # 通路 /redirect.html 的時候,頁面直接302定向到 /index.html中

    rewrite /permanent.html /index.html permanent;
    # 通路 /permanent.html 的時候,頁面直接301定向到 /index.html中

    rewrite ^/html/(.+?).html$ /post/$1.html permanent;
    # 把 /html/*.html => /post/*.html ,301定向

    rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;
    # 把 /search/key => /search.html?keyword=key
}           

last與break的差別案例

server {
    listen 80 default_server;
    server_name www.zhangbiao.com;

    access_log  /var/log/nginx/log/host.access.log  main;

    root /opt/app/code;
    location ~ ^/break {
        rewrite ^/break /test/ break;
    }

    location ~ ^/last {
         rewrite ^/last /test/ last;
    }

    location /test/ {
       default_type application/json;
       return 200 '{"status":"success"}';
    }
}
           

通路:

http://www.zhangbiao.com/test/
Nginx系列教程(7)nginx rewrite配置規則詳細說明
http://www.zhangbiao.com/last/
Nginx系列教程(7)nginx rewrite配置規則詳細說明
http://www.zhangbiao.com/break/
Nginx系列教程(7)nginx rewrite配置規則詳細說明

可以發現通路 last 的時候建立立了一個請求 /test/ ,而通路/break/ 請求的時候 會去 /opt/app/code 下找相應的資源,沒找到是以報錯。

Rewrite規則_redirect和permanent差別

server {
    listen 80 default_server;
    server_name www.zhangbiao.com;

    access_log  /var/log/nginx/log/host.access.log  main;

    root /opt/app/code;
    location ~ ^/imooc {
         rewrite ^/imooc http://www.imooc.com/ permanent;
         #rewrite ^/imooc http://www.imooc.com/ redirect;
    }

}
           

redirect 表示臨時的重定向 ,隻要後端服務是開者的。每次通路 /imoc 都會重定向到

http://www.imooc.com

permanent 表示永久重定向,第一次通路成功後,把後端服務關閉後,通路/imoc 仍然會重定向到

rewrite 規則實戰案例

server {
    listen       80;
    server_name  www.zhangbiao.com;
    root   /opt/app/code;

    location / {
        rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.html break;
        if ($http_user_agent ~* Chrome) {
            rewrite ^/nginx http://coding.imooc.com/class/121.html redirect;
        }

        if (!-f $request_filename) {
            rewrite ^/(.*)$ http://www.baidu.com/$1 redirect;
        }
        index  index.html index.htm;
    }

    error_page   500 502 503 504 404  /50x.html;
}



           
http://www.zhangbiao.com/course-11-22-33.html

通路在 /opt/app/code/course/11/22 下存在的資源檔案

Nginx系列教程(7)nginx rewrite配置規則詳細說明
http://www.zhangbiao.com/course-11-22-5

通路在 /opt/app/code/course/11/22 下不存在的資源檔案 

Nginx系列教程(7)nginx rewrite配置規則詳細說明

rewrite優先級規則

  • 執行server 塊的rewrite 指令。将所有的網站都重定向同一個網站。
  • 執行location比對。
  • 執行標明的location中的rewrite。

本系列往期文章參考

Nginx系列教程(1) nginx基本介紹和安裝入門 Nginx系列教程(2)nginx搭建靜态資源web伺服器 Nginx系列教程(3)nginx緩存伺服器上的靜态檔案 Nginx系列教程(4)nginx處理web應用負載均衡問題以保證高并發 Nginx系列教程(5)如何保障nginx的高可用性(keepalived) Nginx系列教程(6)Nginx location 比對規則詳細解說

繼續閱讀