亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Nginx 學(xué)習(xí)總結(jié)(4)—— Rewrite 模塊

zhjx922 / 2360人閱讀

摘要:根據(jù)官方文檔說明,模塊是用于使用正則表達(dá)式更改請求,有條件地選擇配置,并返回重定向。指令停止執(zhí)行模塊的指令集,但是其他模塊指令不受影響??梢允褂脴?biāo)志來終止指令的進(jìn)一步處理。

這是 Nginx 學(xué)習(xí)總結(jié)的第四篇,上一篇介紹到了 Nginx 學(xué)習(xí)總結(jié)(3) —— Location 模塊,這一篇會(huì)對Rewrite模塊 做一些總結(jié)。根據(jù)官方文檔說明,Rewrite 模塊是用于使用 PCRE 正則表達(dá)式更改請求 URI,有條件地選擇配置,并返回重定向。

表面看,rewritelocation 的功能有點(diǎn)像,都能實(shí)現(xiàn)跳轉(zhuǎn),然而它們的區(qū)別在于:rewrite 是在同一域名內(nèi)更改獲取資源的路徑,而 location 是對一類路徑做控制訪問或反向代理,并且可以 proxy_pass 到其他機(jī)器。

很多情況下 rewrite 也會(huì)寫在 location 里,它們的執(zhí)行順序是:

執(zhí)行 server 塊的 rewrite 指令;

執(zhí)行 location 匹配;

執(zhí)行選定的 location 中的 rewrite 指令。

如果其中某步 URI 被重寫,則重新循環(huán)執(zhí)行1-3,直到找到真實(shí)存在的文件;循環(huán)超過10次,則返回 500 Internal Server Error 錯(cuò)誤。
指令 1. break

停止執(zhí)行 ngx_http_rewrite_module 模塊的指令集,但是其他模塊指令不受影響。

Context: server, location, if
server {
    listen 80;
    
    # 此處 break 會(huì)停止執(zhí)行 server 塊的 return 指令(return 指令屬于rewrite模塊)
    # 如果把它注釋掉 則所有請求進(jìn)來都返回 ok 字符串
    break;
    return 200 "ok";
    
    location = / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }
}
2. if

依據(jù)指定的條件決定是否執(zhí)行 if 塊語句中的內(nèi)容。

Context: server, location

if 中的幾種判斷條件:

一個(gè)變量名,如果變量 $variable 的值為空字符串或者字符串 "0",則為 false;

變量與一個(gè)字符串的比較,相等為 = 不相等為 !=;

變量與一個(gè)正則表達(dá)式的模式匹配,操作符可以是:~ 區(qū)分大小寫的正則匹配; ~* 不區(qū)分大小寫的正則匹配, !~!~* 前面兩者的非;

檢測文件是否存在,使用 -f (存在) 和 !-f (不存在);

檢測路徑是否存在,使用 -d (存在) 和 !-d (不存在) 后面判斷可以是字符串也可是變量;

檢測文件、路徑、或者鏈接文件是否存在,使用 -e (存在) 和 !-e (不存在) ,后面判斷可以是字符串也可是變量;

檢測文件是否為可執(zhí)行文件,使用 -x (可執(zhí)行) 和 !-x (不可執(zhí)行),后面判斷可以是字符串也可是變量。

可以用作 if 判斷的全局變量:

$args 這個(gè)變量等于請求行中的參數(shù),同 $query_string

$content_length 請求頭中的 Content-length 字段

$content_type 請求頭中的 Content-Type 字段

$document_root 當(dāng)前請求在 root 指令中指定的值

$host 請求主機(jī)頭字段,否則為服務(wù)器名稱

$http_user_agent 客戶端 agent 信息

$http_cooki 客戶端 cookie 信息

$limit_rate 這個(gè)變量可以限制連接速率

$request_method 客戶端請求的動(dòng)作,通常為 GETPOST

$remote_addr 客戶端的 IP 地址

$remote_port 客戶端的端口

$remote_user 已經(jīng)經(jīng)過 Auth Basic Module 驗(yàn)證的用戶名

$request_filename 當(dāng)前請求的文件路徑,由 rootalias 指令與 URI 請求生成

$scheme 請求協(xié)議,如 http,https

$server_protocol 請求客戶端協(xié)議,通常是 HTTP/1.0HTTP/1.1

$server_addr 服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個(gè)值

$server_name 服務(wù)器名稱

$server_port 請求到達(dá)服務(wù)器的端口號

$request_uri 包含請求參數(shù)的原始 URI,不包含主機(jī)名,如 /foo/bar.php?arg=baz

$uri 不帶請求參數(shù)的當(dāng)前 URI,$uri 不包含主機(jī)名,如 /foo/bar.html

$document_uri 與 $uri 相同

set $variable "0"; 
if ($variable) {
    # 不會(huì)執(zhí)行,因?yàn)?"0" 為 false
    break;            
}

# 變量與一個(gè)字符串的比較
if ($request_method = POST) {
    return 405;
}

# 變量與正則表達(dá)式的匹配
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

# 檢查文件是否存在,字符串與變量均可
if ( !-f "/data.log" ) {
    break;            
}
if ( !-f $filename ) {
    break;            
}
if 關(guān)鍵字后必須加一個(gè)空格符
3. return

停止處理并將指定的 code 碼返回給客戶端。 從 0.8.42 版本開始, return 語句可以指定重定向 URL (狀態(tài)碼可以為如下幾種 301,302,303,307),也可以為其他狀態(tài)碼指定響應(yīng)的文本內(nèi)容,并且重定向的 URL 和響應(yīng)的文本可以包含變量。

Context: server, location, if
# return code [text];
location = /ok {
    return 200 "ok"; # 返回 ok 給客戶端
}

# return code URL; 
location = /redirect {
    return 302 http://www.baidu.com; # 臨時(shí)重定向
}

# return URL;
location = /redirect {
    return http://www.baidu.com; # 臨時(shí)重定向
}
4. rewrite

使用指定的正則表達(dá)式匹配請求 URL,如果匹配成功,則根據(jù)規(guī)則更改 URL。rewrite 指令按照它們在配置文件中出現(xiàn)的先后順序執(zhí)行??梢允褂?flag 標(biāo)志來終止指令的進(jìn)一步處理。如果替換字符串以 http://、https://$scheme 開頭,則停止處理后續(xù)內(nèi)容,并直接重定向返回給客戶端。語法:rewrite regex replacement [flag];

Context: server, location, if
# 第一種情況,帶 http://
location / {
    rewrite /test1/(.*) http://www.$1.com;
    return 200 "ok";
}
# 在瀏覽器中訪問,被臨時(shí)重定向到 www.baidu.com
# 后面的 return 指令將沒有機(jī)會(huì)執(zhí)行了


# 第二種情況,不帶 http://
location / {
    rewrite /test1/(.*) www.$1.com;
    return 200 "ok";
}
# 在瀏覽器中訪問,返回了 ok

rewrite 的四個(gè) flag

last 停止處理當(dāng)前的 ngx_http_rewrite_module 的指令集,并開始搜索與更改后的 URL 相匹配的 location;

break 停止處理當(dāng)前的 ngx_http_rewrite_module 指令集;

redirect 返回 302 臨時(shí)重定向;

permanent 返回 301 永久重定向。

location / {
    # 順序執(zhí)行如下兩條 rewrite 指令 
    # rewrite 后面沒有任何 flag 時(shí)就順序執(zhí)行 
    # 當(dāng) location 中沒有 rewrite 模塊指令可被執(zhí)行時(shí),就重寫發(fā)起新一輪 location 匹配
    rewrite ^/test1 /test2;
    rewrite ^/test2 /test3;  # 此處發(fā)起新一輪location匹配,重寫后的 url 為 /test3
}

location = /test2 {
    return 200 "/test2";
}  
location = /test3 {
    return 200 "/test3";
}

# 發(fā)送如下請求
# curl 127.0.0.1:8080/test1
# /test3
location / {
    rewrite ^/test1 /test2;
    rewrite ^/test2 /test3 last;  # 此處發(fā)起新一輪 location 匹配,重寫后的 url 為 /test3
    rewrite ^/test3 /test4;
}

location = /test2 {
    return 200 "/test2";
}  
location = /test3 {
    return 200 "/test3";
}
location = /test4 {
    return 200 "/test4";
}

# 發(fā)送如下請求
# curl 127.0.0.1:8080/test1
# /test3 
location / {
    rewrite ^/test1 /test2;
    rewrite ^/test2 /more/index.html break;  # 終止執(zhí)行后續(xù) rewrite 模塊指令,重寫后的 url 為 /more/index.html
    rewrite /more/index.html /test4;
    proxy_pass https://www.baidu.com; # 因?yàn)?proxy_pass 不是 rewrite 模塊的指令,所以它不會(huì)被 break 終止
}

# 發(fā)送如下請求
# curl 127.0.0.1:8080/test1 
# 代理到 百度產(chǎn)品大全頁面: https://www.baidu.com/more/index.html;
5. rewrite_log

開啟或者關(guān)閉 rewrite 模塊指令的執(zhí)行日志,如果開啟,則記錄下 notice 級別的日志到 error_log 中,默認(rèn)為關(guān)閉 off

Context: http, server, location, if
6. set

設(shè)置指定變量的值。變量的值可以包含文本,變量或者是它們的組合形式。

Context: server, location, if
location / {
    set $var1 "host is ";
    set $var2 $host;
    set $var3 " uri is $request_uri";
    return 200 "response ok $var1$var2$var3";
}

# 發(fā)送如下請求
# curl 127.0.0.1:8080/test
# response ok host is 127.0.0.1 uri is /test

參考文章:

搞懂 nginx 的 rewrite 模塊

nginx 配置 location 總結(jié)及 rewrite 規(guī)則寫法

Module ngx_http_rewrite_module

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/39850.html

相關(guān)文章

  • Nginx-深度學(xué)習(xí)

    摘要:深度學(xué)習(xí)篇一動(dòng)靜分離通過中間件將動(dòng)態(tài)請求和靜態(tài)請求進(jìn)行分離。原因分離資源,減少不必要的請求消耗,減少請求延時(shí)。關(guān)閉后,重定向會(huì)失效。驗(yàn)證規(guī)則保持一致。啟動(dòng),也會(huì)要求你輸入密碼。根據(jù)用戶的信息等信息區(qū)別根據(jù)用戶的地址實(shí)現(xiàn)灰度發(fā)布示意圖 Nginx-深度學(xué)習(xí)篇 一、動(dòng)靜分離 通過中間件將動(dòng)態(tài)請求和靜態(tài)請求進(jìn)行分離。原因:分離資源,減少不必要的請求消耗,減少請求延時(shí)。 動(dòng)態(tài)和靜態(tài)請求圖例:s...

    wh469012917 評論0 收藏0
  • Nginx-深度學(xué)習(xí)

    摘要:深度學(xué)習(xí)篇一動(dòng)靜分離通過中間件將動(dòng)態(tài)請求和靜態(tài)請求進(jìn)行分離。原因分離資源,減少不必要的請求消耗,減少請求延時(shí)。關(guān)閉后,重定向會(huì)失效。驗(yàn)證規(guī)則保持一致。啟動(dòng),也會(huì)要求你輸入密碼。根據(jù)用戶的信息等信息區(qū)別根據(jù)用戶的地址實(shí)現(xiàn)灰度發(fā)布示意圖 Nginx-深度學(xué)習(xí)篇 一、動(dòng)靜分離 通過中間件將動(dòng)態(tài)請求和靜態(tài)請求進(jìn)行分離。原因:分離資源,減少不必要的請求消耗,減少請求延時(shí)。 動(dòng)態(tài)和靜態(tài)請求圖例:s...

    Carson 評論0 收藏0
  • nginx(二):進(jìn)階配置介紹--rewrite用法,壓縮,https虛擬主機(jī)等

    摘要:經(jīng)由超文本傳輸協(xié)議通信,但是數(shù)據(jù)包由安全協(xié)議加密,實(shí)現(xiàn)加密數(shù)據(jù)與認(rèn)證功能。該模塊指令定義相關(guān)設(shè)置證書文件,私鑰文件,會(huì)話緩存等內(nèi)容。允許在客戶端建立會(huì)話時(shí)傳遞請求服務(wù)器名稱,這樣服務(wù)器就會(huì)知道該發(fā)送哪個(gè)虛擬主機(jī)下的證書文件。 1、nginx基本狀態(tài)信息頁面 配置示例: location /basic_status { stub_...

    JayChen 評論0 收藏0
  • Nginx

    摘要:此外,其也能夠提供強(qiáng)大的反向代理功能。是由為俄羅斯訪問量第二的站點(diǎn)開發(fā)的,第一個(gè)公開版本發(fā)布于年月日。 keepalived+nginx 實(shí)現(xiàn)高可用雙機(jī)熱備 + 負(fù)載均衡架構(gòu) 1 準(zhǔn)備4個(gè)ubuntu16.04虛擬機(jī)(啟用網(wǎng)卡二并使用橋接模式):A服務(wù)器:192.168.0.103 主B服務(wù)器:192.168.0.104 主(備) 前端工程師學(xué)習(xí) Nginx ...

    syoya 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<