Nginx 核心功能02

目錄

一、引言

二、正向代理

(一)正向代理基礎概念

(二)Nginx 正向代理安裝配置

(三)正向代理配置與驗證

三、反向代理

(一)反向代理原理與應用場景

(二)配置 Nginx 七層代理

(三)配置 Nginx 四層代理

四、Nginx 緩存

(一)緩存功能的核心原理和緩存類型

(二)代理緩存功能設置

五、Nginx rewrite 和正則

(一)Nginx 正則

(二)nginx location

(三)Rewrite


一、引言

Nginx 是一款在現代 Web 架構中占據重要地位的高性能開源軟件,它集 Web 服務器、反向代理、負載均衡等多種功能于一身。其強大的功能和出色的性能,使得它在各類 Web 應用場景中廣泛應用,從大型網站的流量處理到微服務架構中的服務代理,Nginx 都發揮著關鍵作用。本筆記將深入探討 Nginx 的四大核心功能:正向代理、反向代理、緩存以及 rewrite 和正則表達式的應用,通過理論與實踐相結合的方式,幫助讀者全面掌握 Nginx 的核心技術要點。

二、正向代理

(一)正向代理基礎概念

正向代理是客戶端與目標服務器之間的中間服務器。它的主要作用是代表客戶端向目標服務器發起請求,并將目標服務器的響應返回給客戶端。在實際應用中,正向代理常用于企業內網訪問控制、匿名訪問以及資源緩存加速等場景。例如,企業可以利用正向代理限制員工訪問特定的網站,如社交媒體,以提高工作效率和保障網絡安全;用戶可以通過正向代理隱藏自己的真實 IP 地址,實現匿名訪問互聯網;同時,正向代理還可以緩存公共資源,如軟件包、鏡像文件等,減少外網帶寬的消耗,加快資源的訪問速度。

(二)Nginx 正向代理安裝配置

  1. 安裝支持軟件:Nginx 的編譯和運行依賴于一些軟件包,如 pcre、zlib 等。在安裝 Nginx 之前,需要先安裝這些軟件的開發包(devel),以提供相應的庫和頭文件。在 CentOS 系統中,可以使用以下命令進行安裝:
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar

這些軟件包分別為 Nginx 提供了不同的功能支持,gcc 和 make 用于編譯 Nginx 源代碼,pcre-devel 提供正則表達式支持,zlib-devel 用于數據壓縮,openssl-devel 用于支持 HTTPS,perl-ExtUtils-MakeMaker 用于構建和安裝 Perl 擴展,git 用于獲取第三方模塊,wget 用于下載文件,tar 用于解壓文件。

  1. 創建運行用戶、組和日志目錄:為了提高安全性和便于管理,建議為 Nginx 創建專門的用戶和組。創建一個名為 nginx 的用戶,不創建宿主文件夾,并且禁止該用戶登錄到 Shell 環境。同時,創建 Nginx 的日志目錄,并設置相應的權限:
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx

這樣,Nginx 服務將以 nginx 用戶和組的身份運行,降低了安全風險,并且所有的日志文件都將由 nginx 用戶和組進行管理。

  1. 編譯安裝 Nginx:下載 Nginx 的源代碼包(如 nginx-1.26.3_http_proxy.tar.gz)并解壓,然后進入解壓后的目錄進行配置。在配置過程中,需要指定安裝目錄、運行用戶和組、啟用的模塊等。由于默認的 Nginx 不支持轉發 https 請求,因此需要添加第三方模塊(如 ngx_http_proxy_connect_module)來實現該功能。具體的命令如下:
[root@localhost ~]# tar zxf nginx-1.26.3_http_proxy.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --with-http_gzip_static_module --add-module=./ngx_http_proxy_connect_module
[root@localhost nginx-1.26.3]# make && make install

在上述配置中,各個參數的含義如下:

  • --prefix=/usr/local/nginx:指定 Nginx 的安裝目錄為 /usr/local/nginx。
  • --user=nginx--group=nginx:指定 Nginx 的運行用戶和組為 nginx。
  • --with-http_ssl_module:啟用對 HTTPS 的支持。
  • --with-http_v2_module:支持 HTTP/2 協議。
  • --with-http_realip_module:用于獲取客戶端的真實 IP 地址。
  • --with-http_stub_status_module:可以查看 Nginx 的連接狀態等統計信息。
  • --with-http_gzip_static_module:啟用對靜態文件的 gzip 壓縮功能,提高傳輸效率。
  • --with-pcre:支持正則表達式,這在 Nginx 的配置中非常重要,例如在 rewrite 規則中經常會用到。
  • --with-stream:支持 TCP 和 UDP 反向代理。
  • --with-stream_ssl_module:為 TCP 反向代理提供 SSL 加密支持。
  • --with-stream_realip_module:在 TCP 反向代理中獲取客戶端的真實 IP 地址。
  • --add-module=./ngx_http_proxy_connect_module:添加第三方模塊,以支持 https 請求的轉發。

安裝完成后,為了方便使用,可以為 Nginx 的主程序創建一個鏈接文件,這樣就可以在任意目錄下直接執行 nginx 命令:

[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

  1. 添加 Nginx 系統服務:為了便于管理 Nginx 服務的啟動、停止、重啟等操作,可以將 Nginx 添加為系統服務。在 CentOS 系統中,可以通過編寫 systemd 服務腳本來實現。創建一個名為 nginx.service 的文件,內容如下:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root[Install]
WantedBy=multi-user.target

上述配置中,[Unit]部分用于描述服務的基本信息,After=network.target表示 Nginx 服務在網絡服務啟動之后啟動;[Service]部分定義了服務的啟動、停止、重啟等操作的命令,ExecStartPre=/usr/local/sbin/nginx -t用于在啟動前檢查 Nginx 配置文件的語法正確性,ExecStart=/usr/local/sbin/nginx用于啟動 Nginx 服務,ExecReload=/usr/local/sbin/nginx -s reload用于重新加載配置文件,ExecStop=/bin/kill -s QUIT $MAINPID用于停止 Nginx 服務;[Install]部分定義了服務的安裝信息,WantedBy=multi-user.target表示該服務在多用戶模式下被啟用。

保存文件后,重新加載 systemd 服務配置,啟動 Nginx 服務,并設置為開機自啟:

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx

(三)正向代理配置與驗證

  1. 配置正向代理:編輯 Nginx 的主配置文件(/usr/local/nginx/conf/nginx.conf),添加正向代理的相關配置。在配置中,需要指定代理監聽的端口、解析域名的 DNS 服務器、啟用代理 CONNECT 方法(以支持 HTTPS)、設置連接超時時間等。同時,在 location 塊中配置代理轉發規則:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf

在文件中添加或修改以下內容:

server {listen 8080; # 代理監聽端口server_name proxy.example.com;resolver 8.8.8.8 1.1.1.1; # 解析域名使用的DNS服務器,多個DNS用空格分隔proxy_connect; # 啟用代理CONNECT方法,支持HTTPSproxy_connect_allow 443 80; # 允許代理到80和443端口proxy_connect_connect_timeout 10s;proxy_connect_read_timeout 10s;proxy_connect_send_timeout 10s;location / {proxy_pass $scheme://$http_host$request_uri; # 動態協議轉發proxy_set_header Host $http_host;proxy_buffers 256 4k; # 優化緩沖區proxy_max_temp_file_size 0;proxy_http_version 1.1;proxy_set_header Connection "";}
}

在上述配置中,listen指定了代理監聽的端口為 8080;server_name指定了代理服務器的域名;resolver指定了用于解析域名的 DNS 服務器;proxy_connect啟用了代理 CONNECT 方法,使得代理服務器可以支持 HTTPS 請求;proxy_connect_allow允許代理到 80 和 443 端口;proxy_connect_connect_timeoutproxy_connect_read_timeoutproxy_connect_send_timeout分別設置了連接、讀取和發送數據的超時時間;在location /塊中,proxy_pass指定了代理轉發的目標地址,使用$scheme://$http_host$request_uri實現了動態協議轉發,proxy_set_header用于設置請求頭信息,proxy_buffersproxy_max_temp_file_size用于優化緩沖區設置,proxy_http_version指定了使用的 HTTP 版本,proxy_set_header Connection ""用于保持連接。

保存配置文件后,檢查配置文件的語法正確性,并重新加載 Nginx 配置:

[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload

  1. 驗證正向代理:在 Windows 系統中,可以使用火狐瀏覽器進行驗證。打開火狐瀏覽器的設置,找到網絡代理選項,設置 http 和 https 代理為 Nginx 正向代理服務器的 IP 和端口(如 192.168.10.101:8080)。在 Linux 系統中,可以使用 curl 命令進行驗證,指定代理服務器進行訪問測試:
[root@localhost ~]# curl -x http://192.168.10.101:8080 www.baidu.com

通過查看 Nginx 的訪問日志(位于 /var/log/nginx 目錄下),可以確認正向代理功能是否正常。如果日志中記錄了通過代理服務器的訪問請求,并且隱藏了真實 IP 地址,說明正向代理配置成功。

三、反向代理

(一)反向代理原理與應用場景

Nginx 的反向代理分為七層(應用層)反向代理和四層(網絡層)反向代理。七層反向代理基于 HTTP/HTTPS 協議,能夠深入解析應用層的內容,如 URL、Header、Cookie 等,并根據這些信息將客戶端的請求精準地轉發至后端服務器。它在負載均衡、動靜分離、SSL 終端、灰度發布等場景中發揮著重要作用。例如,在負載均衡場景中,七層反向代理可以將流量均勻地分發到多臺后端服務器上,避免單點故障,提高系統的可用性;在動靜分離場景中,靜態資源(如圖片、CSS、JS 文件)可以由 Nginx 直接響應,而動態請求(如 PHP、API 請求)則轉發至后端的 Apache 或 Tomcat 服務器,提高資源的訪問效率;在 SSL 終端場景中,Nginx 可以統一處理 HTTPS 加密和解密,降低后端服務器的計算壓力;在灰度發布場景中,根據請求的特征(如 IP 地址、Header 信息等),可以將部分流量導向新版本的服務,實現服務的平滑升級。

四層反向代理基于 TCP/UDP 協議,直接轉發原始數據流,不解析應用層內容。它適用于對性能和延遲要求較高的傳輸層場景,如數據庫代理、游戲服務器、SSH 跳板機、高可用服務等。例如,在數據庫代理場景中,四層反向代理可以對外暴露統一的端口,內部將請求轉發至 MySQL、Redis 集群,實現對數據庫的統一訪問;在游戲服務器場景中,代理 UDP 協議,實現實時數據包的負載均衡,保障游戲的流暢運行;在 SSH 跳板機場景中,通過端口映射實現安全訪問內網服務器;在高可用服務場景中,實現 TCP 服務(如 MQTT)的主備切換與健康檢查,確保服務的高可用性。

(二)配置 Nginx 七層代理

  1. 環境準備:在后端服務器(如 192.168.10.102)上,關閉防火墻,安裝 httpd 服務,并創建一個測試頁面:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# dnf install httpd -y
[root@localhost ~]# echo "這是后端主機" > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd

上述命令分別停止了防火墻,安裝了 httpd 服務,創建了一個簡單的測試頁面,并啟動了 httpd 服務。

  1. 配置七層代理轉發:在 Nginx 服務器(如 192.168.10.101)上,編輯 Nginx 的配置文件,定義后端應用服務器的地址池,并配置請求轉發規則。打開 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf),添加或修改以下內容:
http {upstream backend {server 192.168.10.102:80; # 后端主機設置}server {listen 80;server_name example.com;location / {proxy_pass http://backend; # 請求轉發proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}

在上述配置中,upstream backend定義了后端應用服務器的地址池,server 192.168.10.102:80指定了后端服務器的 IP 地址和端口;在server塊中,listen 80指定了 Nginx 監聽的端口,server_name example.com指定了域名;在location /塊中,proxy_pass http://backend將請求轉發至后端地址池,proxy_set_header Host $host將請求中的 Host 頭部設置為客戶端請求的主機名,proxy_set_header X-Real-IP $remote_addr將請求中的 X - Real - IP 頭部設置為客戶端的真實 IP 地址。

保存配置文件后,檢查配置文件的語法正確性,并重新加載 Nginx 配置:

[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload

  1. 驗證轉發效果:在 Nginx 服務器上,使用 curl 命令訪問 Nginx 的 IP 地址,驗證請求是否成功轉發至后端 httpd 服務:
[root@localhost ~]# curl 192.168.10.101

如果返回 “這是后端主機”,說明七層代理轉發配置成功。后端地址池中還可以定義多臺主機,實現負載均衡,相關內容將在后續進一步學習。

(三)配置 Nginx 四層代理

  1. 配置四層代理:以代理 SSH 請求至后端服務器為例,在 Nginx 服務器(如 192.168.10.101)上編輯 Nginx 配置文件。打開 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf),添加或修改以下內容:
stream {upstream ssh_cluster {server 192.168.10.102:22; # 后端地址和服務端口}server {listen 2222;proxy_pass ssh_cluster;proxy_connect_timeout 5s; # 連接超時時間proxy_timeout 1h; # 長連接保持時間}
}

在上述配置中,stream模塊用于配置四層代理,upstream ssh_cluster定義了后端地址池,server 192.168.10.102:22指定了后端 SSH 服務器的 IP 地址和端口;在server塊中,listen 2222指定了 Nginx 監聽的端口,proxy_pass ssh_cluster將請求轉發至后端地址池,proxy_connect_timeout 5s設置了連接超時時間,proxy_timeout 1h設置了長連接保持時間。

需要注意的是,stream模塊需要與http模塊平級,不能在http模塊中嵌套。保存配置文件后,檢查配置文件的語法正確性,并重新加載 Nginx 配置,同時檢查端口監聽情況:

[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
[root@localhost ~]# ss -nlpt | grep 2222

  1. 驗證四層代理:在本地使用 ssh 命令連接 Nginx 服務器的代理端口(如 2222),驗證是否能成功登錄到后端服務器:
[root@localhost ~]# ssh root@192.168.10.101 -p2222

登錄后,使用 ifconfig 命令查看網絡配置,確認是否登錄到了正確的后端服務器。如果能成功登錄并看到后端服務器的網絡配置,說明四層代理配置成功。

四、Nginx 緩存

(一)緩存功能的核心原理和緩存類型

  1. 代理緩存:在反向代理場景下,Nginx 從后端服務器(如 Tomcat、Apache)獲取響應內容并緩存。當客戶端首次請求數據時,Nginx 若發現緩存中沒有該數據,會向后端服務器請求,獲取數據后返回給客戶端并緩存。后續客戶端再次請求相同數據時,Nginx 直接從緩存中讀取并返回,減少后端服務器負載和響應時間。
  2. FastCGI 緩存:主要用于緩存通過 FastCGI 協議處理的動態內容,像 PHP、Python 等語言生成的頁面數據。使用時通常需配合 PHP - FPM 等 FastCGI 進程管理器,提升動態內容的訪問速度。
  3. uWSGI/SCGI 緩存:與 FastCGI 緩存類似,針對使用 uWSGI 或 SCGI 協議的后端應用,為這類應用提供緩存加速。
  4. 靜態資源緩存:通過 expires 指令設置客戶端瀏覽器緩存靜態資源(如圖片、CSS、JS 文件)的時間。這并非服務端緩存,而是讓客戶端在指定時間內直接從本地緩存讀取資源,減少對服務端的請求。

(二)代理緩存功能設置

  1. 反向代理配置:首先要配置好七層反向代理,確保 Nginx 能正確轉發請求到后端服務器。這部分配置與之前七層反向代理的配置類似,在 Nginx 配置文件中定義后端地址池和請求轉發規則:
http {upstream backend {server 192.168.10.102:80;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}

  1. 設置緩存功能:創建緩存目錄并設置權限,然后在 Nginx 配置文件中定義緩存路徑、參數、緩存鍵、緩存有效期等。
    • 創建緩存目錄并設置權限:
[root@localhost ~]# mkdir -p /data/nginx/cache
[root@localhost ~]# chown nginx:nginx /data/nginx/cache -R

  • 編輯 Nginx 配置文件添加緩存相關配置:
http {proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g use_temp_path=off;server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_cache my_cache;proxy_cache_key "$scheme$request_method$host$request_uri";proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_valid any 5s;add_header X-Cache-Status $upstream_cache_status;}}
}

  • 關鍵配置解析
    • proxy_cache_path:定義緩存文件存儲路徑為/data/nginx/cache
    • levels=1:2:表示緩存目錄層級結構,將緩存文件按特定規則分布在不同層級目錄,提高查找效率。
    • keys_zone=my_cache:10m:定義名為my_cache的共享內存區域,大小為 10m,用于存儲緩存鍵和元數據(如過期時間)。每 1MB 共享內存大約可存儲 8000 個鍵。
    • inactive=60m:設置緩存內容的閑置有效期為 60 分鐘。若 60 分鐘內緩存內容未被訪問,將被自動刪除。
    • max_size=1g:限制緩存目錄最大磁盤空間為 1GB。當緩存量達到 1GB 時,Nginx 啟動 LRU(最近最少使用)算法清理舊緩存,為新緩存騰出空間。
    • use_temp_path=off:推薦設置為 off,使臨時文件與緩存文件存儲在同一目錄,減少磁盤 I/O 操作,提升性能。

  1. 驗證緩存功能:使用 curl 命令驗證緩存功能。首次請求時,查看響應頭中的X - Cache - Status字段,應為MISS,表示未命中緩存;再次請求時,該字段應為HIT,表示命中緩存。同時,可查看緩存目錄(/data/nginx/cache)確認數據已被緩存:
[root@localhost ~]# curl -I 192.168.10.101
[root@localhost ~]# curl -I 192.168.10.101
[root@localhost ~]# ls /data/nginx/cache

五、Nginx rewrite 和正則

(一)Nginx 正則

  1. 常用正則表達式元字符:在學習 Nginx 的 Rewrite 模塊前,需要熟悉正則表達式。常用的正則表達式元字符如下:
    • ^:匹配輸入字符串的起始位置。例如,^hello表示匹配以hello開頭的字符串。
    • $:匹配輸入字符串的結束位置。例如,world$表示匹配以world結尾的字符串。
    • *:匹配前面的字符零次或多次。例如,go*能匹配ggogoo等。
    • +:匹配前面的字符一次或多次。例如,go+能匹配gogoo,但不能匹配g
    • ?:匹配前面的字符零次或一次。例如,colou?r能匹配colorcolour
    • .:匹配除\n之外的任何單個字符。若要匹配包括\n在內的任意字符,可使用[\s\S]
    • \:將后面接著的字符標記為一個特殊字符、原義字符或向后引用。例如,\n匹配一個換行符,\\匹配\
    • \d:匹配純數字。例如,\d+能匹配一個或多個數字組成的字符串。
    • {n}:重復 n 次。例如,a{3}匹配aaa
    • {n,}:重復 n 次或更多次。例如,a{3,}匹配aaaaaaa等。
    • [c]:匹配單個字符c。例如,[abc]匹配abc
    • [a - z]:匹配a - z小寫字母的任意一個。例如,[a - z]+匹配由小寫字母組成的字符串。
    • [a - zA - Z]:匹配a - z小寫字母或A - Z大寫字母的任意一個。
  2. 應用場景:Nginx 正則表達式在 Rewrite 規則中廣泛應用,如路徑美化(將/product/123轉換為/index.php?id=123)、舊鏈接遷移(將過期 URL 永久重定向到新地址)、強制 HTTPS / 域名統一(自動跳轉http://https://,合并www與非www域名)、動態路由(適配單頁應用、RESTful API 路由)、灰度發布(按規則將部分流量導向新版本服務)等場景。

(二)nginx location

  1. 語法與匹配模式:location 是 Nginx 中用于匹配請求 URI(路徑,僅對域名后邊除去傳遞參數外的字符串起作用)的核心指令,用于根據請求路徑定義不同的處理邏輯。其語法為location [匹配模式] {處理邏輯(如root, proxy_pass, rewrite等)},匹配模式類型包括:
    • location /uri:普通前綴匹配,匹配以指定路徑開頭的 URI。例如,location /static/匹配以/static/開頭的 URI。
    • location = /:精確匹配,僅匹配完全相同的 URI,優先級最高。例如,location = /index.html只匹配/index.html
    • location ~:區分大小寫的正則表達式匹配。例如,location ~ \.jpg$匹配以.jpg結尾的 URI。
    • location ~*:不區分大小寫的正則表達式匹配。例如,location ~* \.jpg$匹配以.jpg.JPG結尾的 URI。
    • location ^~:精確前綴匹配,匹配前綴路徑后,不再檢查正則匹配,優先級高于正則。例如,location ^~ /static/匹配以/static/開頭的 URI,且不再進行正則匹配。
    • location /:通用匹配,默認方式,優先級最低,其他方式匹配不到時匹配。
  2. 優先級規則:精確匹配 > 精確前綴匹配 > 正則匹配(^~~/~*同時存在時,文件中物理位置靠上的優先) > 普通前綴匹配 > 通用匹配。
  3. 驗證示例:編輯 Nginx 配置文件進行 location 驗證:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

添加如下內容:

location / {return 200 "通用匹配";
}
location /abc {return 200 "普通前綴匹配";
}
location ~ /test/abcdef {return 200 "區分大小寫正則";
}
location ~* /test/abc {return 200 "不區分大小寫正則";
}
location ^~ /abcdef {return 200 "精確前綴匹配";
}
location = /abc {return 200 "精確匹配";
}

保存并重新加載 Nginx 配置:

[root@localhost ~]# nginx -s reload

使用 curl 命令測試不同的 URI:

[root@localhost ~]# curl 192.168.10.101/abc

每次請求192.168.10.101/abc后,按優先級順序依次注釋配置文件中的 location,會發現每次的響應內容發生變更。使用正則模式時,URI 部分可以使用正則表達式,例如:

location ~ \. (jpg|png|gif)$ {# 處理圖片請求的邏輯
}

(三)Rewrite

  1. 語法與執行順序:Rewrite 用于對 URL 進行重寫,其語法為rewrite <regex><replacement> [flag];。其中,regex是用于正則匹配 URL 字符串的表達式(僅對域名后邊除去傳遞參數外的字符串起作用),replacement是重寫跳轉后的地址,flag有以下幾種類型:
    • last:重寫后的 URI 會重新觸發 location 匹配,并執行新匹配到的 location 塊中的指令,是默認類型。
    • break:重寫后的 URI 不會重新匹配 location,直接在當前 location 中處理,且后續的 rewrite 指令不再執行。
    • redirect:返回 302 臨時重定向,瀏覽器地址會顯示跳轉后的 URL 地址,爬蟲不會更新 url(因為是臨時)。
    • permanent:返回 301 永久重定向,瀏覽器地址欄會顯示跳轉后的 URL 地址,爬蟲更新 url。
    • Rewrite 可以放在server{}if{}location{}配置段中,在不同配置段中的執行順序和作用域不同:
      • server{}中的 rewrite:在請求進入 server 塊后、匹配 location 前執行,影響該 server 塊下所有請求(全局生效)。
      • location{}塊中的 rewrite:在請求匹配到該 location 后執行,僅對該 location 匹配的請求生效(局部生效)。
      • if{}塊中的 rewrite:在滿足 if 條件時觸發,作用域依賴 if 表達式所在的上下文(如在 server 中或 location 中)。
  2. flag 驗證示例:編輯 Nginx 配置文件進行 flag 驗證:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

添加如下內容進行last標記驗證:

default_type text/plain;
location /abc {rewrite ^/ /def last;
}
location /def {return 200 "this is def";
}

保存并重新加載 Nginx 配置,使用瀏覽器請求,會發現響應內容是this is def,說明last標記后繼續向下匹配 location。

修改配置文件進行break標記驗證:

default_type text/plain;
location /abc {rewrite ^/ /def break;
}
location /def {return 200 "this is def";
}

重新加載配置后使用瀏覽器請求,會發現請求頁面未找到,說明break標記使用當前結果不繼續向下匹配了。

類似地,對redirectpermanent標記進行驗證,修改配置文件:

default_type text/plain;
location /abc {rewrite ^/ /def redirect;
}
location /def {return 200 "this is def";
}

重新加載配置后使用瀏覽器請求,會發現請求頁面 302 跳轉,并且地址欄顯示的是跳轉后的地址。

redirect改為permanent進行驗證,會發現請求頁面 301 跳轉,并且地址欄顯示的是跳轉后的地址。
3.?捕獲組與引用:在 Nginx 的 rewrite 指令中,小括號()用于定義正則表達式的捕獲組(Capture Group)。捕獲的文本可以通過$1$2$3等變量在重寫后的 URI 中引用。例如:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

添加如下內容:

location /category/ {rewrite ^/category/(.+)/(\d+)$ /archive/$1/$2 last;
}
location /archive/ {return 200 "Category: $1, ID: $2";
}

測試訪問:

[root@localhost ~]# curl http://localhost/category/tech/456

會返回Category: tech, ID: 456,說明捕獲組正常工作。
4.?set 指令:在 Nginx 中,set指令用于定義變量并賦值,這些變量可以用于后續的條件判斷、日志記錄、重寫規則等場景。語法為set $variable value;。例如:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

添加如下內容:

location /demo {set $name "Nginx";return 200 "Hello, $name!";
}

測試訪問:

[root@localhost ~]# curl http://localhost/demo

會返回Hello, Nginx!,說明set指令正常工作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78390.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探索 C++23 std::to_underlying:枚舉底層值獲取的利器

文章目錄 引言基本概念作用使用示例與之前方法的對比在 C23 中的意義總結 引言 在 C 的發展歷程中&#xff0c;每一個新版本都帶來了許多令人期待的新特性和改進&#xff0c;以提升代碼的安全性、可讀性和可維護性。C23 作為其中的一個重要版本&#xff0c;也不例外。其中&…

WGDI-分析WGD及祖先核型演化的集成工具-文獻精讀126

WGDI: A user-friendly toolkit for evolutionary analyses of whole-genome duplications and ancestral karyotypes WGDI&#xff1a;一款面向全基因組重復事件與祖先核型演化分析的易用工具集 摘要 在地球上大多數主要生物類群中&#xff0c;人們已檢測到全基因組復制&…

C# 方法(控制流和方法調用)

本章內容: 方法的結構 方法體內部的代碼執行 局部變量 局部常量 控制流 方法調用 返回值 返回語句和void方法 局部函數 參數 值參數 引用參數 引用類型作為值參數和引用參數 輸出參數 參數數組 參數類型總結 方法重載 命名參數 可選參數 棧幀 遞歸 控制流 方法包含了組成程序的…

「Mac暢玩AIGC與多模態16」開發篇12 - 多節點串聯與輸出合并的工作流示例

一、概述 本篇在輸入變量與單節點執行的基礎上,擴展實現多節點串聯與格式化合并輸出的工作流應用。開發人員將掌握如何在 Dify 工作流中統一管理輸入變量,通過多節點串聯引用,生成規范統一的最終輸出,為后續構建復雜邏輯流程打下基礎。 二、環境準備 macOS 系統Dify 平臺…

解鎖Windows異步黑科技:IOCP從入門到精通

在當今快節奏的數字化時代&#xff0c;軟件應用對性能的追求可謂永無止境。無論是高并發的網絡服務器&#xff0c;還是需要快速處理大量文件的桌面應用&#xff0c;都面臨著一個共同的挑戰&#xff1a;如何在有限的系統資源下&#xff0c;實現高效的數據輸入輸出&#xff08;I/…

Java學習手冊:Spring 生態其他組件介紹

一、微服務架構相關組件 Spring Cloud 服務注冊與發現 &#xff1a; Eureka &#xff1a;由 Netflix 開源&#xff0c;包含 Eureka Server 和 Eureka Client 兩部分。Eureka Server 作為服務注冊表&#xff0c;接收服務實例的注冊請求并管理其信息&#xff1b;Eureka Client 負…

VMware Workstation 創建虛擬機并安裝 Ubuntu 系統 的詳細步驟指南

VMware Workstation 創建虛擬機并安裝 Ubuntu 系統 的詳細步驟指南 一、準備工作1. 下載 Ubuntu 鏡像2. 安裝 VMware Workstation 二、創建虛擬機1. 新建虛擬機向導2. 選擇虛擬機配置類型3. 加載安裝鏡像4. 系統類型配置5. 虛擬機命名與存儲6. 磁盤容量分配7. 硬件自定義&#…

串口的緩存發送以及緩存接收機制

#創作靈感# 在我們實際使用MCU進行多串口任務分配的時候&#xff0c;我們會碰到這樣一種情況&#xff0c;即串口需要短間隔周期性發送數據&#xff0c;且相鄰兩幀之間需要間隔一段時間&#xff0c;防止連幀。我們常常需要在軟件層面對串口的發送和接受做一個緩存的處理方式。 …

時間交織(TIADC)的失配誤差校正處理(以4片1GSPS采樣率的12bitADC交織為例講解)

待寫…有空再寫&#xff0c;有需要的留言。 存在失配誤差的4GSPS交織 校正完成后的4GSPS交織

Linux進程間通信(二)之管道1【匿名管道】

文章目錄 管道什么是管道匿名管道用fork來共享管道原理站在文件描述符角度-深度理解管道站在內核角度-管道本質 接口實例代碼管道特點管道的4種情況管道讀寫規則應用場景 管道 什么是管道 管道是Unix中最古老的進程間通信的形式。 我們把從一個進程連接到另一個進程的一個數…

Xilinx FPGA | 管腳約束 / 時序約束 / 問題解析

注&#xff1a;本文為 “Xilinx FPGA | 管腳約束 / 時序約束 / 問題解析” 相關文章合輯。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 Xilinx FPGA 管腳 XDC 約束之&#xff1a;物理約束 FPGA技術實戰 于 2020-02-04 17:14:53 發布 說明&#x…

家用服務器 Ubuntu 服務器配置與 Cloudflare Tunnel 部署指南

Ubuntu 服務器配置與 Cloudflare Tunnel 部署指南 本文檔總結了我們討論的所有內容&#xff0c;包括 Ubuntu 服務器配置、硬盤擴容、靜態 IP 設置以及 Cloudflare Tunnel 的部署步驟。 目錄 硬盤分區與擴容設置靜態 IPCloudflare Tunnel 部署SSH 通過 Cloudflare Tunnel常見…

分享5款開源、美觀的 WinForm UI 控件庫

前言 今天大姚給大家分享5款開源、美觀的 WinForm UI 控件庫&#xff0c;助力讓我們的 WinForm 應用更好看。 WinForm WinForm是一個傳統的桌面應用程序框架&#xff0c;它基于 Windows 操作系統的原生控件和窗體。通過簡單易用的 API&#xff0c;開發者可以快速構建基于窗體…

PHP盲盒商城系統源碼從零搭建部署:專業級開發與優化實踐

【導語&#xff1a;技術驅動商業創新】 在2025年社交電商全面升級的浪潮下&#xff0c;基于PHP的盲盒系統憑借其高開發效率與低成本優勢&#xff0c;成為中小企業的首選方案。本文將深度拆解盲盒源碼從開發到部署的全流程技術細節&#xff0c;涵蓋架構設計、性能優化與安全防護…

(33)VTK C++開發示例 ---圖片轉3D

文章目錄 1. 概述2. CMake鏈接VTK3. main.cpp文件4. 演示效果 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;VTK開發 &#x1f448; 1. 概述 這是 VTK 測試 clipArt.tcl 的改編版本。 提供帶有 2D 剪貼畫的 jpg 文件&#xff0c;該示例將創建 3D 多邊形數據模…

2025東三省B題深圳杯B題數學建模挑戰賽數模思路代碼文章教學

完整內容請看文章最下面的推廣群 已經完成全部問題的代碼和建模 一、問題一的模型構建與優化&#xff08;RGB顏色空間轉換模型&#xff09; 基礎模型&#xff08;線性映射模型&#xff09;/高斯過程回歸模型&#xff08;GPR&#xff09;&#xff1a; 針對高清視頻源&#xff0…

linux netlink實現用戶態和內核態數據交互

1&#xff0c;內核態代碼 #include <linux/module.h> #include <linux/netlink.h> #include <net/sock.h> #define NETLINK_TEST 31 struct sock *nl_sk NULL; static void nl_recv_msg(struct sk_buff *skb) { struct nlmsghdr *nlh; int pid; …

LeetCode:DP-多狀態問題

簡單 面試題 17.16. 按摩師 一個有名的按摩師會收到源源不斷的預約請求&#xff0c;每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間&#xff0c;因此她不能接受相鄰的預約。給定一個預約請求序列&#xff0c;替按摩師找到最優的預約集合&#xff08;總預約時間最…

Spring AOP---面向切面編程由認識到使用

1. AOP AOP(Aspect-Oriented Programming), 是一種思想, 面向切面編程。 在前文統一異常處理&#xff0c;統一結果返回就是使用了這一思想&#xff08;都是在集中處理某一類事情, 但又不影響原有代碼的正常運行&#xff09;&#xff0c;但他們不是AOP&#xff0c;只是應用了這…

專題二十四:虛擬專用網絡

一、VPN簡介 VPN&#xff08;Virtual Personal Network&#xff09;即虛擬專用網&#xff0c;泛指通過VPN技術在公用網絡上構建的虛擬專用網絡。VPN用戶在此虛擬網絡中傳輸私網流量&#xff0c;在不改變網絡現狀的情況下實現安全、可靠的連接。其主要功能是在公用網絡上建立專…