歡迎光臨
每天分享高質量文章

Nginx基礎——Rewrite規則

點擊上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

Rewrite規則學習記錄

rewrite是nginx一個特別重要的指令,該指令可以使用正則運算式改寫URI。可以指定一個或多個rewrite指令,按順序匹配。

正則匹配規則

1~  區分大小寫匹配
2~* 不區分大小寫匹配
3!~ 和 !~* 區分大小寫不匹配及不區分大小寫不匹配

檔案及目錄匹配

1-f和!-f 判斷是否存在檔案
2-d和!-d 判斷是否存在目錄
3-e和!-e 判斷是否存在檔案或目錄
4-x和!-x 判斷檔案是否可執行

rewrite基本語法

1set
2if
3return
4break
5rewrite

break指令

1使用範圍:server,location,if;
2中斷當前相同作用域的其他nginx配置。

if指令

1使用範圍:server,location
2檢查一個條件是否符合。If指令不支持嵌套,不支持多個條件&&和||處理。

return指令

1格式:return code ;
2使用範圍:server,location,if;
3結束規則的執行並傳回狀態碼給客戶端。

set指令

1使用環境:server,location,if
2定義一個變數,並給變數賦值。變數的值可以為文本、變數或者變數的組合。
3set $var "hello world"

rewrite指令格式

1rewrite regex replacement [flag]
2
3flag標誌位有四種:
4break:停止rewrite檢測,也就是說當含有break flag的rewrite陳述句被執行時,該陳述句就是rewrite的最終結果。 
5last:停止rewrite檢測,但是跟break有本質的不同,last的陳述句不一定是最終結果。
6redirect:傳回302臨時重定向,一般用於重定向到完整的URL(包含http:部分) 
7permanent:傳回301永久重定向,一般用於重定向到完整的URL(包含http:部分)

應用實體(摘自網絡)

當訪問的檔案和目錄不存在時,重定向到某個php檔案

1if( !-e $request_filename )
2{
3    rewrite ^/(.*)$ index.php last;
4}

目錄對換 /123456/xxxx ====> /xxxx?id=123456

1rewrite ^/(\d+)/(.+)/  /$2?id=$1 last;

如果客戶端使用的是IE瀏覽器,則重定向到/ie目錄下

1if$http_user_agent ~ MSIE)
2{
3    rewrite ^(.*)$ /ie/$1 break;
4}
1

禁止訪問以/data開頭的檔案

1location ~ ^/data
2{
3    deny all;
4}

禁止訪問以.sh,.flv,.mp3為檔案後綴名的檔案

1location ~ .*\.(sh|flv|mp3)$
2{
3    return 403;
4}

設置某些型別檔案的瀏覽器快取時間

1location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
2{
3    expires 30d;
4}

檔案反盜鏈並設置過期時間

 1location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ 
2{
3    valid_referers none blocked *.linuxidc.com*.linuxidc.net localhost 208.97.167.194;
4    if ($invalid_referer) {
5        rewrite ^/ http://img.linuxidc.net/leech.gif;
6        return 412;
7        break;
8    }
9    access_log  off;
10    root /opt/lampp/htdocs/web;
11    expires 3d;
12    break;
13}

將多級目錄下的檔案轉成一個檔案,增強seo效果

1/job-123-456-789.html 指向/job/123/456/789.html
2
3rewrite^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

域名跳轉

1server
2{
3    listen 80;
4    server_name jump.linuxidc.com;
5    index index.html index.htm index.php;
6    root /opt/lampp/htdocs/www;
7    rewrite ^/ http://www.linuxidc.com/;
8    access_log off;
9}

多域名轉向

1server_name www.linuxidc.comwww.linuxidc.net;
2index index.html index.htm index.php;
3root  /opt/lampp/htdocs;
4if ($host ~ "linuxidc\.net") {
5    rewrite ^(.*) http://www.linuxidc.com$1permanent;
6}

附錄 —— nginx全域性變數

 1arg_PARAMETER #這個變數包含GET請求中,如果有變數PARAMETER時的值。
2args #這個變數等於請求行中(GET請求)的引數,如:foo=123&bar;=blahblah;
3binary_remote_addr #二進制的客戶地址。
4body_bytes_sent #響應時送出的body位元組數數量。即使連接中斷,這個資料也是精確的。
5content_length #請求頭中的Content-length欄位。
6content_type #請求頭中的Content-Type欄位。
7cookie_COOKIE #cookie COOKIE變數的值
8document_root #當前請求在root指令中指定的值。
9document_uri #與uri相同。
10host #請求主機頭欄位,否則為服務器名稱。
11hostname #Set to themachine’s hostname as returned by gethostname
12http_HEADER
13is_args #如果有args引數,這個變數等於”?”,否則等於”",空值。
14http_user_agent #客戶端agent信息
15http_cookie #客戶端cookie信息
16limit_rate #這個變數可以限制連接速率。
17query_string #與args相同。
18request_body_file #客戶端請求主體信息的臨時檔案名。
19request_method #客戶端請求的動作,通常為GET或POST。
20remote_addr #客戶端的IP地址。
21remote_port #客戶端的端口。
22remote_user #已經經過Auth Basic Module驗證的用戶名。
23request_completion #如果請求結束,設置為OK。 當請求未結束或如果該請求不是請求鏈串的最後一個時,為空(Empty)。
24request_filename #當前請求的檔案路徑,由root或alias指令與URI請求生成。
25request_uri #包含請求引數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。不能修改。
26scheme #HTTP方法(如http,https)。
27server_protocol #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
28server_addr #服務器地址,在完成一次系統呼叫後可以確定這個值。
29server_name #服務器名稱。
30server_port #請求到達服務器的端口號。





如果你對 Dubbo 感興趣,歡迎加入我的知識星球一起交流。

知識星球

目前在知識星球(https://t.zsxq.com/2VbiaEu)更新瞭如下 Dubbo 原始碼解析如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 服務器

16. P2P 服務器

17. HTTP 服務器

18. 序列化 Serialization

19. 集群容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing


一共 60 篇++

原始碼不易↓↓↓

點贊支持老艿艿↓↓

赞(0)

分享創造快樂