nginx配置之if,break,return,rewrite


 一、if

條件判斷,並根據結果選擇不同的nginx配置
可以在server塊,location塊使用

語法:
if (condition) {
    ...
}

其中:
condition:判斷條件,包括:
    nginx內置變量
    =,!=: 判斷變是否相等
    正則表達式: ~(區分大小寫),~*(不區分大小寫),!~(~取反),!~*(~*取反)
    -f,!-f: 文件時是否存在
    -d,!-d: 目錄是否存在
    -e,!-e: 目錄或文件是否在使用
    -x,!-x: 文件是否可執行

 

示例

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}

 

二、break

break
跳出當前作用域,回到上一層繼續向下,與break同級且位於后面的會被忽略
可以在server塊,location塊,if塊中使用

 

示例

if ($slow) {
    limit_rate 10k;
    break;
}

 

三、return

停止處理請求,直接向客戶端返回響應狀態碼,
執行return指令后,同一級中后面的指令都會無效
可以在location塊,server塊,if塊中使用,return指令比rewrite指令簡單高效,盡量使用return

語法:
return code;
return code [text];
return code URL;
return URL;

其中:
code:返回給客戶端的狀態碼
第一個語法中的code包含所有的http狀態碼
第三個語法中的code包含:
301:永久重定向
302:臨時重定向
303:臨時重定向,應使用GET方法定向獲取請求的資源
307:臨時重定向
308:永久重定向

text:返回給客戶端的響應體內容,支持nginx內置變量

URL(統一資源定位符):重定向后返回給客戶端的URL地址

 

示例

1 返回狀態碼

server {
     listen       80;
     server_name  localhost;
     charset      utf-8;
     
     location / {
         return 403;
      }
}

2 返回狀態碼和響應體內容
server {
     listen       80;
     server_name  localhost;
     charset      utf-8;
     
     location / {
         return 200 'Status Code:200';
      }
}
使用谷歌瀏覽器訪問會下載包含響應體內容的文本



3 重定向至其他URL

server {
     listen       80;
     server_name  localhost;
     charset      utf-8;
     
     location ^~ /web/ {
         root /usr/share/nginx/html;
         index index.hmtl index.htm;
      }
      
      location / {
         return 301 /web/;
}


使用谷歌瀏覽器訪問ip:80會重定向到ip:80/web/

4 不加狀態碼重定向到其他URL
server {
     listen       80;
     server_name  localhost;
     charset      utf-8;
     
     location ^~ /web/ {
         root /usr/share/nginx/html;
         index index.hmtl index.htm;
      }
      
      location / {
         return $scheme://主機ip:80/web/;
}

使用谷歌瀏覽器訪問ip:80會重定向到ip:80/web/

 

四、rewrite

根據匹配的正則表達式,重寫URL
可以同時存在一個或多個rewrite指令
可以在location塊,server塊,if塊中使用
rewrite接收的URI不包括host地址,即訪問http:ip:port/test/,rewrite會接受到/test/;
也不包括請求指令,即訪問http:ip:port/test/?a=1&b=3,rewrite會接受到/test/


語法:
rewrite regex replacement [flag]

其中
regex:用於匹配URI(通用資源標識符)的正則表達式,可以使用"()"來標記要截取的內容
replacement:用於替換匹配成功后的URI的字符串,支持nginx內置變量
flag:用於設置rwrite對URI的處理行為,包含:
    last:終止本location塊,將重寫后的URI使用各location塊再次進行處理,一般使用在server塊和if塊
    break:使用重寫后的URL在本location塊中繼續處理,一般使用在location塊
    redirect:將重寫后的URI返回給客戶端,狀態碼為302,指明臨時重定向
    permanent:將重寫后的URI返回給客戶端,狀態碼為301,指明永久重定向

 

示例

1 域名跳轉,重寫至www.baidu.com
server {
     listen       80;
     server_name  localhost;
     charset      utf-8;
      
     location / {
         rewrite '^/test/' http://www.baidu.com ;
}

使用谷歌瀏覽器訪問ip:80/test/,實際訪問http://www.baidu.com

2 

server {
     listen       80;
     server_name  localhost;
     charset      utf-8;
     
     location ^~ /web/ {
         root /usr/share/nginx/html;
         index index.hmtl index.htm;
      }
      
      location / {
         rewrite '^/([a-z]{3})/(.*)' /web/$1/$2 permanent;
}

其中$1表示引用前面的([a-z]{3}),$2表示引用前面的'(.*)'
使用谷歌瀏覽器訪問ip:80/aaa/xxx,實際訪問http://ip:80/web/aaa/xxx

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM