一、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