成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Ingress企業實戰:URL重寫與高級玩法

網絡 網絡管理
在Nginx、Apache等常見的Web服務器中,URL重寫可以通過正則表達式、規則匹配等方式來實現。具體的語法和方法會因服務器軟件的不同而有所不同。

什么是URL重寫

URL重寫(URL rewriting)是一種在Web服務器上修改或轉換請求URL的過程。它通常涉及使用服務器配置或規則來更改傳入的URL,以便在不改變實際請求資源的情況下,實現不同的行為,如重定向、路徑映射、參數處理等。URL重寫在服務器層面進行,因此客戶端(如瀏覽器)對于URL的請求不會感知到這些更改,但服務器會根據配置進行適當的處理。URL重寫可以用于多種目的,例如:

  1. 重定向: 將一個URL重寫為另一個URL,實現301永久重定向或302臨時重定向。這可以用于更改站點結構、修復錯誤的URL、實現SEO優化等。
  2. 路徑映射: 將一個URL的路徑映射到另一個位置,這對于隱藏實際文件路徑或路徑重組很有用。
  3. 查詢參數處理: 在URL中添加、刪除或修改查詢參數,以適應不同的應用需求。
  4. 動態URL到靜態URL: 將動態生成的URL(帶有參數)轉化為靜態URL,更友好且易于索引。
  5. 隱藏技術細節: 可以通過URL重寫隱藏后端服務器或應用程序的實際技術細節,提高安全性。

在Nginx、Apache等常見的Web服務器中,URL重寫可以通過正則表達式、規則匹配等方式來實現。具體的語法和方法會因服務器軟件的不同而有所不同。通常,服務器配置文件中會有專門的部分用于配置URL重寫規則,例如在Nginx中是使用rewrite指令。URL重寫是一種強大的技術,但在使用時需要小心,確保配置正確以避免潛在的問題,例如無限循環重定向或錯誤的重寫規則可能導致網站不可用。

Ingress 內置變量

內置預定義變量即無需聲明就可以使用的變量,通常包括一個http請求或響應中一部分內容的值,以下為一些常用的內置預定義變量:

變量名 定義
$arg_PARAMETER  GET請求中變量名PARAMETER參數的值。
$args   這個變量等于GET請求中的參數。例如,foo=123&bar=blahblah;這個變量只可以被修改
$binary_remote_addr 二進制碼形式的客戶端地址。
$body_bytes_sent    傳送頁面的字節數
$content_length 請求頭中的Content-length字段。
$content_type   請求頭中的Content-Type字段。
$cookie_COOKIE  cookie COOKIE的值。
$document_root  當前請求在root指令中指定的值。
$document_uri   與$uri相同。
$host   請求中的主機頭(Host)字段,如果請求中的主機頭不可用或者空,則為處理請求的server名稱(處理請求的server的server_name指令的值)。值為小寫,不包含端口。
$hostname   機器名使用 gethostname系統調用的值
$http_HEADER    HTTP請求頭中的內容,HEADER為HTTP請求中的內容轉為小寫,-變為_(破折號變為下劃線),例如:$http_user_agent(Uaer-Agent的值);
$http_user_agent : 客戶端agent信息;
$http_cookie : 客戶端cookie信息;
$sent_http_HEADER   HTTP響應頭中的內容,HEADER為HTTP響應中的內容轉為小寫,-變為_(破折號變為下劃線),例如: $sent_http_cache_control, $sent_http_content_type…;
$is_args    如果$args設置,值為"?",否則為""。
$limit_rate 這個變量可以限制連接速率。
$nginx_version  當前運行的nginx版本號。
$query_string   與$args相同。
$remote_addr    客戶端的IP地址。
$remote_port    客戶端的端口。
$remote_user    已經經過Auth Basic Module驗證的用戶名。
$request_filename   當前連接請求的文件路徑,由root或alias指令與URI請求生成。
$request_body   這個變量(0.7.58+)包含請求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比較有意義。
$request_body_file  客戶端請求主體信息的臨時文件名。
$request_completion 如果請求成功,設為"OK";如果請求未完成或者不是一系列請求中最后一部分則設為空。
$request_method 這個變量是客戶端請求的動作,通常為GET或POST。包括0.8.20及之前的版本中,這個變量總為main request中的動作,如果當前請求是一個子請求,并不使用這個當前請求的動作。
$request_uri    這個變量等于包含一些客戶端請求參數的原始URI,它無法修改,請查看$uri更改或重寫URI,
包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。
$scheme 所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_addr    服務器地址,在完成一次系統調用后可以確定這個值,如果要繞開系統調用,則必須在listen中指定地址并且使用bind參數。
$server_name    服務器名稱。
$server_port    請求到達服務器的端口號。
$server_protocol    請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
$uri    請求中的當前URI(不帶請求參數,參數位于args),不同于瀏覽器傳遞的args),不同于瀏覽器傳遞的args),不同于瀏覽器傳遞的request_uri的值,它可以通過內部重定向,或者使用index指令進行修改。uri不包含主機名,如”/foo/bar.html”。

Ingress 正則表達式

正則表達式匹配,其中:
~       為區分大小寫匹配
~*      為不區分大小寫匹配
!~和!~*  分別為區分大小寫不匹配及不區分大小寫不匹配
.      匹配除換行符以外的任意字符
\w     匹配字母或數字或下劃線或漢字
\s     匹配任意的空白符
\d     匹配數字
\b     匹配單詞的開始或結束
^      匹配字符串的開始
$      匹配字符串的結束
*         重復零次或更多次
+         重復一次或更多次
?         重復零次或一次
{n}       重復n次
{n,}      重復n次或更多次
{n,m}     重復n到m次
*?        復任意次,但盡可能少重復
+?        重復1次或更多次,但盡可能少重復
??        重復0次或1次,但盡可能少重復
{n,m}?    重復n到m次,但盡可能少重復
{n,}?     重復n次以上,但盡可能少重復
\W        匹配任意不是字母,數字,下劃線,漢字的字符
\S        匹配任意不是空白符的字符
\D        匹配任意非數字的字符
\B        匹配不是單詞開頭或結束的位置
[^x]      匹配除了x以外的任意字符
[^aeiou]  匹配除了aeiou這幾個字母以外的任意字符   
(exp)         匹配exp,并捕獲文本到自動命名的組里
(?<name>exp)  匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp)       匹配exp,不捕獲匹配的文本,也不給此分組分配組號   
(?=exp)       匹配exp前面的位置
(?<=exp)      匹配exp后面的位置
(?!exp)       匹配后面跟的不是exp的位置
(?<!exp)      匹配前面不是exp的位置
(?#comment)   注釋分組不對正則表達式的處理產生任何影響

配置URL重寫規則

在某些應用場景中,后端服務提供的URL與Ingress規則中執行的路徑不同,而Ingress訪將訪問路徑直接轉發到后端相同路徑,如果不配置URL重寫規則,所有訪問都將返回404。比如如下案例,Ingress規則中配置的是/user/info,而后端服務提供的訪問路徑是/info,在不配置重寫的情況下,會直接轉發給后端/user/info與實際提供的訪問路徑/info不匹配,會直接返回404。接下來咱們用案例的方式進行驗證。

不配置URL重寫直接轉發:

$ cat ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: demo-svc
            port:
              number: 8080
  ingressClassName: nginx

$ kubectl apply -f ingress.yml
ingress.networking.k8s.io/demo configured

訪問驗證(/user/info):

# 訪問/user/info,可以看出直接返回404
$ curl http://demo.kubesre.com/user/info
404 page not found

配置URL重寫:

$  cat ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /user(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: demo-svc
            port:
              number: 8080
  ingressClassName: nginx

$ kubectl apply -f ingress.yml
ingress.networking.k8s.io/demo configured

訪問驗證(/user/info):

# 訪問/user/info,可以看出直接正常返回了
$ curl  http://demo.kubesre.com/user/info
{"message":"云原生運維圈!"}

注解說明:

以上案例Ingress重寫是通過nginx.ingress.kubernetes.io/rewrite-target注解實現不同路徑的重寫規則。占位符$2表示將第二個括號即(.*)中匹配到的所有字符填寫到nginx.ingress.kubernetes.io/rewrite-target注解中。想必大家都知道Ingress是基于Nginx開發的,此時是通過Ingress CRD進行創建的重寫配置,其本質也是修改Nginx配置文件的,此時從Ingress里的Nginx拷貝出來的配置如下:

server {
  server_name demo.kubesre.com ;

  listen 80  ;
  listen [::]:80  ;
  listen 443  ssl http2 ;
  listen [::]:443  ssl http2 ;

  set $proxy_upstream_name "-";

  ssl_certificate_by_lua_block {
   certificate.call()
  }

  location ~* "^/user(/|$)(.*)" {

   set $namespace      "default";
   rewrite "(?i)/user(/|$)(.*)" /$2 break;
   proxy_pass http://upstream_balancer;

   proxy_redirect     off;
   }

高級URL重寫規則

對于一些復雜的重寫規則需求,可以通過如下注解來實現,其本質也是修改Nginx配置文件。

  • nginx.ingress.kubernetes.io/server-snippet:在nginx.conf的“server”字段中添加自定義配置。
  • nginx.ingress.kubernetes.io/configuration-snippet:在nginx.conf的“location”字段中添加自定義配置。

URL重寫Flag參數:

  • last:表示本條規則匹配完成后繼續向下匹配。
  • break:表示本條規則匹配完成后停止匹配。
  • redirect:表示臨時重定向,返回狀態碼302。
  • permanent:表示永久重定向,返回狀態碼301。

重定向就是將網頁自動轉向重定向:

  • 301永久性重定向:新網址完全繼承舊網址,舊網址的SEO網絡搜索引擎的排名等完全清零
  • 301重定向是網頁更改地址后對搜索引擎友好的最好方法,只要不是暫時搬移的情況,都建議使用301來做轉址。
  • 302臨時性重定向:對舊網址沒有影響,但新網址不會有排名
  • 搜索引擎爬蟲會抓取新的內容而保留舊的網址

配置Location:

通過Ingress注解nginx.ingress.kubernetes.io/server-snippet配置location,訪問/sre,返回401錯誤代碼,案例如下:

$ cat sre.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
       location /sre {
        return 401;
        }
  name: demo-redirect
spec:
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: demo-svc
            port:
              number: 8080
  ingressClassName: nginx

$ kubectl apply -f 1.yml
ingress.networking.k8s.io/demo-redirect configured

訪問驗證:

# 表示驗證成功
$ curl http://demo.kubesre.com/sre/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>

URL重定向(permanent):

cat  demo-permanent.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^/$ https://www.baidu.com redirect;
  name: demo-redirect
spec:
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: demo-svc
            port:
              number: 8080
  ingressClassName: nginx

$ kubectl apply -f demo-permanent.yml
ingress.networking.k8s.io/demo-permanent created

訪問驗證:

# 301永久重定向,瀏覽器?地址欄會顯示跳轉后的URL地址,真實效果可以通過瀏覽器訪問測試驗證
$ curl http://demo.kubesre.com
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

URL重定向(redirect):

通過URL重定向,訪問/test/info,直接重定向302跳轉到/user/info。

$ cat demo-redirect.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
       rewrite ^/test/(.*)$ /user/$1 redirect;
  name: demo-redirect
spec:
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /test
        pathType: ImplementationSpecific
        backend:
          service:
            name: demo-svc
            port:
              number: 8080
  ingressClassName: nginx
  
$ kubectl apply -f demo-redirect.yml
ingress.networking.k8s.io/demo-redirect created

訪問驗證:

# 302 說明已經重定向了,實際效果可以通過瀏覽器訪問查看
$ curl  http://demo.kubesre.com/test/info
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

URL重寫(last):

通過URL重寫實現,訪問/sre,返回的是/kube的結果,可以利用重寫Flag last參數,當URL重寫后,會發送一個新的請求,再次進入server塊,重試location匹配,匹配成功直接把結果直接返回。

$ cat sre.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^/sre /kube last;
    nginx.ingress.kubernetes.io/server-snippet: |
       location /sre {
        return 401;
        }
        location /kube {
        return 403;
        }
  name: demo-redirect
spec:
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /sre
        pathType: ImplementationSpecific
        backend:
          service:
            name: demo-svc
            port:
              number: 8080
  ingressClassName: nginx

$ kubectl apply -f sre.yml
ingress.networking.k8s.io/demo-redirect configured

訪問驗證:

# 訪問/sre,則返回/kube結果403
$ curl http://demo.kubesre.com/sre/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>

總結

本文介紹了URL重寫的概念,并通過實際案例的方式講解了URL重寫的方方面面,下一章將講解Ingress更多企業級實戰,請敬請期待!

責任編輯:武曉燕 來源: 云原生運維圈
相關推薦

2023-09-06 07:17:57

2022-01-12 08:10:40

APISIXIngress Url Rewrite

2009-10-13 14:38:15

.NET重寫URL

2009-07-31 09:39:59

ASP.NET和URL

2009-08-05 14:46:17

ASP.NET url

2015-07-08 10:01:55

JavaURL重寫過程實錄

2022-05-24 12:50:58

Pandas索引代碼

2019-05-15 15:40:18

朋友圏微信評論

2024-07-22 16:26:47

2009-12-30 14:28:09

ASP.NET Web

2021-08-10 08:34:23

網絡攻擊高級威脅攻擊網絡安全

2011-02-15 09:05:35

重寫程序

2023-05-11 15:39:34

模型設計

2012-07-31 13:28:03

GAE

2023-09-05 07:24:33

Traefik加權輪詢

2022-08-19 08:00:00

OPA集成Kubernetes集群

2023-09-15 08:00:20

Ingress網關Istio

2011-08-08 15:43:24

一體機評測

2024-06-28 09:52:47

列表Python

2021-03-07 16:41:06

URLSpring5
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av网站在线播放 | 国产亚洲精品一区二区三区 | 久久精品久久久久久 | 99re在线 | av在线免费观看网站 | 欧美在线国产精品 | 欧美一级二级视频 | 91精品在线播放 | 亚洲男女激情 | 羞羞视频在线观看网站 | 欧美成年人视频在线观看 | 日本精品视频在线观看 | 精品久久中文字幕 | 久久久久久久久91 | 国产精品成人一区二区三区 | 中文日韩在线 | 色吧综合网 | 色婷婷久久久亚洲一区二区三区 | 巨大黑人极品videos精品 | 欧美精品二区 | 亚洲精品乱码8久久久久久日本 | 91免费电影 | 国产精品资源在线观看 | 国产欧美一区二区三区久久人妖 | 久久精品 | 久久69精品久久久久久国产越南 | 亚洲中午字幕 | 国产一区影院 | 成人免费一区二区三区牛牛 | 一级做a爰片性色毛片16 | 在线第一页 | www视频在线观看 | 久久亚洲综合 | 亚洲久久久 | 超碰人人91| 鸡毛片 | 一区二区三区欧美大片 | 亚洲国产成人精品女人久久久 | 国产精品成人国产乱一区 | 欧美精品一区二区三区在线 | av大片在线观看 |