日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

ingress-nginx-url重寫的經驗總結

作者:老鐘私房菜 更新時間: 2022-10-11 編程語言

Ingress 配置中關于重寫的注解有:

注解名 描述
nginx.ingress.kubernetes.io/app-root 訪問主域名的時候會自動跳轉到app-root注解指定的路徑
nginx.ingress.kubernetes.io/rewrite-target 將匹配到的url重定向到rewrite-target注解指定的路徑
nginx.ingress.kubernetes.io/server-snippet 使用注解可以在server{...}配置塊中添加自定義的配置
nginx.ingress.kubernetes.io/configuration-snippet 使用該注解可以在Nginx的location{...}位置添加額外配置

官方介紹:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

下面重點介紹如何使用Ingress-Nginx自定義配置實現規則的重寫(Rewrite)。

一、Rewrite 執行順序

  1. 執行server塊的rewrite指令;
  2. 執行location匹配;
  3. 執行配到location中的rewrite指令;

二、Rewrite 相關指令

2.1 if 指令

描述:判斷條件;
語法:if (condition) { ... }
作用域:server,location

if ($request_method = POST){
  ...
}

condition可以是:

  1. 變量名:如果這個變量是空字符串或者以0開始的字符串,則返回false,否則為true;
  2. = 和 !=:比較的一個變量和字符串;
  3. ~ 和 ~*:匹配正則表達式;
  4. -f 和 !-f:檢查一個文件是否存在;
  5. -d 和 !-d:檢查一個目錄是否存在;
  6. -e 和 !-e:檢查一個文件、目錄、符號鏈接是否存在;
  7. -x 和 !-x:檢查一個文件是否可執行;

2.2 return 指令

描述:返回狀態碼給客戶端,或重定向到指定URL,完成客戶端請求的處理。
語法:return [CODE] [URL]
作用域:server,location

return 301 https://m.example.com;

3.3 rewrite 指令

描述:該指令通過正則來改變url,可以同時存在一個或者多個rewrite指令。
語法:rewrite regex replacement [flag];
作用域:server,location,if
參數說明:
regex:用于匹配uri的正則表達式。使用圓括號()標記要截取的內容
replacement:匹配成功后用于替換uri中被截取內容的字符串,默認情況下,如果該字符串是由http://或者https://開頭的,則不會繼續向下對uri進行其他處理,而是直接將重寫后的uri返回給客戶端;
flag:來設置rewrite對uri的處理行為,具體值如下:

flag參數值 描述
last 停止處理后續rewrite指令集,然后對當前重寫的新URI在rewrite指令集上重新查找
break 停止處理后續rewrite指令集,并不在重新查找,但是當前location內剩余非rewrite語句和location外的的非rewrite語句可以執行
redirect 如果replacement不是以http:// 或https://開始,返回302臨時重定向
permant 返回301永久重定向

lastbreak標記的區別:last標記在本條rewrite規則執行完后,會對其所在的server { … } 標簽重新發起請求,而break標記則在本條規則匹配完成后,不再繼續匹配。

rewrite ^/api/user /api/v1/user break;

如果要引用匹配到的內容,那么需要使用小括號()將正則表達式包含起來,然后通過$num來引用匹配到的內容。比如:$1表示引用第一個括號匹配的內容,$2表示的是前面第二個()匹配的內容。

rewrite ^/api/(user|order|com)/(.*) /api/v1/$1/$2 break;

三、變量

3.1 自定義變量

定義變量可以使用set指令,其格式:

set $變量名 變量值;

set指令的作用范圍是server、location、if。

如果使用變量,可以直接通過變量名進行訪問。

set $agentFlag 0;

if ( $http_user_agent ~* "(Mobile)" ) {
  set $agentFlag 1;
}

if ( $agentflag = 1 ) {
  return 301 https://m.example.com;
}

3.2 自帶變量

Nginx默認自帶一些變量,可以很方便的獲取到服務器環境的各種信息。

變量名 描述
$args 請求行參數,同$query_string
$content_length Content-length請求頭
$content_type Content-Type請求頭
$document_root 當前請求在root指令中指定的值
$host 主機名或服務器名稱
$http_user_agent 客戶端信息
$http_cookie cookie日志信息
$limit_rate 連接速率限制
$request_method 請求方式
$remote_addr 客戶端IP
$remote_port 客戶端端口
$remote_user 經過Auth Basic Module驗證的用戶名
$request_filename 當前請求的文件路徑,由root或alias指令與URI請求生成
$scheme 請求方法
$server_protocol 服務器協議版本
$server_addr 服務器地址
$server_name 服務器名稱
$server_port 服務器端口號
$request_uri 包含請求參數的原始URI,但不包含主機名
$uri 同上,但是不帶請求參數
$document_uri 同$uri

四、Location匹配規則

=開頭表示精確匹配;
^~ 開頭表示uri以某個常規字符串開頭,理解為匹配url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到;
~ 開頭表示區分大小寫的正則匹配 ;
~* 開頭表示不區分大小寫的正則匹配;
!~``開頭表示區分大小寫不匹配; !~*開頭表示不區分大小寫的正則不匹配;
/ 表示通用匹配,任何請求都會匹配到;

原文鏈接:https://blog.csdn.net/zhongliwen1981/article/details/122319993

欄目分類
最近更新