LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

nginx中uri重寫,break、last、redirect有什么區別

admin
2025年6月28日 22:29 本文熱度 272

ngx_http_rewrite_module 

  1. nginx中ngx_http_rewrite_module模塊提供URI重寫功能 ,通過正則表達式匹配目標URI,再重寫URI請求。
  2. 這個模塊包含break、if、return、rewrite、set指令。

break指令 

  1. 可用在server、location、if塊中。
  2. 用于停止處理當前ngx_http_rewrite_module指令集。

return指令 

  1. 用于停止處理并立即返回到客戶端,非標準狀態碼444會導致連接關閉。
  2. 從0.8.42版本開始,可以返回重定向(狀態碼為:301,302,303,307,308),重定向的URI可以是當前服務中的URI,完整的URL根據請求協議$scheme生成。可以返回響應內容,響應內容和重定向的URL中可以包含變量。
  3. 可以用在server,location,if塊中。
  4. 在0.7.51以前的版本只能返回以下指定的狀態碼:204,400,402,406,408,410,411,413,416,500,504。
  5. 1.1.16和1.0.13以前的版本中307不當作重定向處理。
  6. 1.13.0以前的版本中308不當作重定向處理。
  7. return用法
    • return code [text];  返回狀態碼和響應內容。
    • return code URL;  返回重定向,code只能為301,302,303,307,308。
    • return URL;  返回重定向,狀態碼默認為302。
  8. 案例
    • 配置文件
      server {
       listen 86;
       server_name 192.168.1.166;

       location /home {
         return 200 "home page";
       }

       location /index {
         return 301 /home;
       }

       location /baidu {
         return https://www.baidu.com;
       }
      }
    • 測試
      • 請求:GET http://192.168.1.166:86/home,響應:200 home page
      • 請求:GET http://192.168.1.166:86/index,響應:301 http://192.168.1.166:86/home
      • 請求:GET http://192.168.1.166:86/baidu,響應:302 https://www.baidu.com

    rewrite指令 

    1. 語法:rewrite regex replacement [flag]; ,rewrite指令按它在配置文件中出現的先后順序執行。
    2. 正則表達式匹配成功URI后按replacement設置的文本替換原URI,如果replacement替換文本以http://或https://或$scheme開頭則會停止處理并返回給客戶端重定向。
    3. 可以用在server, location, if塊中。
    4. 可以使用flag來終止指令進一步執行。flag可以為:
      • last,停止處理當前指令集,搜索新的location,使用新的uri直接響應,響應狀態碼由新的uri確定,而不是返回重定向。
      • break,停止處理當前指令集,但不會搜索新的location
      • redirect,如果replacement不以http:// https:// $scheme開頭返回臨時重定向,狀態碼為302。
      • permanent,返回永久重定向,狀態碼為301。
    5. 案例
    • rewrite配合lastrewrite正則表達式匹配成功后會繼續搜索location,搜索到以后使用新的uri直接響應,而并不會向客戶端返回重定向的響應。
      • 配置文件

        server {
         rewrite_log on;
        # 配置后日志中可查看重寫前后的uri
         error_log /usr/local/nginx/logs/error.log notice;
         listen 86;
         server_name 192.168.1.166;

         location ~ ^/music/(\d+)\.mp3$ {
           return 200 "/music/$1.mp3";
         }

         location ~ ^/video/(\d+)\.mp4$ {
           return 200 "/video/$1.mp4";
         }

        # server塊內的rewrite
         rewrite ^/download/mp3/(\d+)\.mp3$ /music/$1.mp3 last;
         rewrite ^/download/mp4/(\d+)\.mp4$ /video/$1.mp4 last;
        }
      • 測試

        • 請求:GET http://192.168.1.166:86/download/mp3/001.mp3,響應:200 /music/001.mp3,這里狀態碼是200而不是3打頭的重定向,效果類似于代理。


        • 請求:GET http://192.168.1.166:86/download/mp4/001.mp4,響應:200 /video/001.mp4,這里狀態碼是200而不是3打頭的重定向。

    • rewrite配合break,匹配成功后不會從location中搜索而是嘗試從文件系統中讀取
      • 配置文件
        server {
         rewrite_log on;
         error_log /usr/local/nginx/logs/error.log notice;
         listen 86;
         server_name 192.168.1.166;

         location ~ ^/music/(\d+)\.mp3$ {
           return 200 "/music/$1.mp3";
         }

         location ~ ^/video/(\d+)\.mp4$ {
           return 200 "/video/$1.mp4";
         }

         location /download/ {
          rewrite ^/download/mp3/(\d+)\.mp3$ /music/$1.mp3 break;
          rewrite ^/download/mp4/(\d+)\.mp4$ /video/$1.mp4 break
         }
        }
      • 測試
        • 請求:GET http://192.168.1.166:86/download/mp3/001.mp3,響應:404 Not Found
        • 處理過程:/download/mp3/001.mp3重寫為/music/001.mp3,但不會匹配別的location而是嘗試從文件目錄/usr/local/nginx/html/music/001.mp3中讀取,站點根目錄下沒有這個文件所以返回404。
        • nginx日志:^/download/mp3/(\d+)\.mp3$" matches "/download/mp3/001.mp3rewritten data: "/music/001.mp3open() "/usr/local/nginx/html/music/001.mp3" failed (2: No such file or directory)
    • rewrite不帶flag
      • 配置文件
        server {
         rewrite_log on;
         error_log /usr/local/nginx/logs/error.log notice;
         listen 86;
         server_name 192.168.1.166;

         location /test1 {
          rewrite ^/test1/(.+)$ /test2/$1 last;
         }

         location /test2 {
          rewrite ^/test2/(.+)$ /test3/$1;
         return 200 "/test2/$1";
         }

         location /test3 {
         return 200 "/test3";
         }
        }
      • 測試
        • 請求:http://192.168.1.166:86/test1/order,響應:200 /test2/order
        • 處理過程:/test1/order/test1塊中被重寫為/test2/order,進入/test2塊中后被重寫為/test3/order但因為rewrite ^/test2/(.+)$ /test3/$1;后沒有break所以執行了塊內下一句return 200 "/test2/$1";,$1匹配的是order因此返回/test2/order
      • 修改/test2塊內的配置,重定向以后break從而停止當前塊內的處理,配置文件:
         location /test2 {
          rewrite ^/test2/(.+)$ /test3/$1 break;
          return 200 "/test2/$1";
         }
      • 準備測試文件,echo "1.html" > /usr/local/nginx/html/test3/1.html
      • 重新測試
        • 請求:GET http://192.168.1.166:86/test1/1.html,響應:200 1.html
        • 處理過程:/test2塊中重寫為/test3/1.html,break以后不會搜索別的location因此沒有進入/test3塊內,而是從文件目錄中讀取1.html返回。
    • rewrite配合redirect
      • 配置文件

        server {
         rewrite_log on;
         error_log /usr/local/nginx/logs/error.log notice;
         listen 86;
         server_name 192.168.1.166;
         
         location ~ ^/music/(\d+)\.mp3$ {
          return 200 "/music/$1.mp3";
         }
         
         rewrite ^/download/mp3/(\d+)\.mp3$ /music/$1.mp3 redirect;
        }
      • 測試

        • 請求:GET http://192.168.1.166:86/download/mp3/001.mp3,響應:302 http://192.168.1.166:86/music/001.mp3

      • redirectlast的區別:last會使用新的uri直接響應,而redirect會向客戶端返回重定向,如下圖:


    • rewrite配合permanent
      • 配置文件

        server {
         rewrite_log on;
         error_log /usr/local/nginx/logs/error.log notice;
         listen 86;
         server_name 192.168.1.166;
         
         location ~ ^/music/(\d+)\.mp3$ {
          return 200 "/music/$1.mp3";
         }
         
         rewrite ^/download/mp3/(\d+)\.mp3$ /music/$1.mp3 permanent;
        }
      • 測試

        • 請求:GET http://192.168.1.166:86/download/mp3/001.mp3,響應:301 http://192.168.1.166:86/music/001.mp3

      • permanentredirect區別:返回狀態碼不同,permanent返回301永久重定向,redirect返回臨時重定向302。


    閱讀原文:原文鏈接


    該文章在 2025/7/1 23:39:32 編輯過
    關鍵字查詢
    相關文章
    正在查詢...
    點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
    點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
    點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
    點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
    Copyright 2010-2025 ClickSun All Rights Reserved

    黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
    日韩欧美中文在线套图 | 在线人成精品免费视频 | 中文字幕免费不卡一区 | 中文字幕在线免费观看一区 | 亚洲日本一区二区三区 | 亚洲国产中字幕在线尤物视频 |