溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nginx全局變量及rewrite實戰(zhàn)

發(fā)布時間:2020-07-09 22:20:42 來源:網絡 閱讀:141 作者:大屁孩兒 欄目:系統(tǒng)運維

Rwrite相關全局變量
coding.net/u/aminglinux/p/nginx/git/blob/master/rewrite/variable.md
Rwrite實戰(zhàn)
coding.net/u/aminglinux/p/nginx/git/blob/master/rewrite/example.md

nginx 常用全局變量
變量 說明
$args 請求中的參數,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2
$content_length HTTP請求信息里的"Content-Length"
$conten_type HTTP請求信息里的"Content-Type"
$document_root nginx虛擬主機配置文件中的root參數對應的值
$document_uri 當前請求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的參數 #常用
$host 主機頭,也就是域名 #常用
$http_user_agent 客戶端的詳細信息,也就是瀏覽器的標識,用curl -A可以指定 #常用
$http_cookie 客戶端的cookie信息
$limit_rate 如果nginx服務器使用limit_rate配置了顯示網絡速率,則會顯示,如果沒有設置, 則顯示0
$remote_addr 客戶端的公網ip
$remote_port 客戶端的port
$remote_user 如果nginx有配置認證,該變量代表客戶端認證的用戶名
$request_body_file 做反向代理時發(fā)給后端服務器的本地資源的名稱
$request_method 請求資源的方式,GET/PUT/DELETE等
$request_filename 當前請求的資源文件的路徑名稱,相當于是$document_root/$document_uri的組合
$request_uri 請求的鏈接,包括$document_uri和$args #常用
$scheme 請求的協(xié)議,如ftp,http,https
$server_protocol 客戶端請求資源使用的協(xié)議的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等
$server_addr 服務器IP地址
$server_name 服務器的主機名
$server_port 服務器的端口號
$uri 和$document_uri相同 #常用
$http_referer 客戶端請求時的referer,通俗講就是該請求是通過哪個鏈接跳過來的,用curl -e可以指定 #常用

Rewrite實戰(zhàn)

本部分內容為nginx生產環(huán)境中使用的場景示例。

域名跳轉(域名重定向)

示例1(不帶條件的):
server{
listen 80;
server_name www.aminglinux.com;
rewrite /(.*) http://www.aming.com/$1 permanent;
.......

}

示例2(帶條件的):
server{
listen 80;
server_name www.aminglinux.com aminglinux.com;
if ($host != 'www.aminglinux.com')
{
rewrite /(.*) http://www.aminglinux.com/$1 permanent;
}
.......

}
示例3(http跳轉到https):
server{
listen 80;
server_name www.aminglinux.com;
rewrite /(.*) https://www.aminglinux.com/$1 permanent;
.......

}
示例4(域名訪問二級目錄)
server{
listen 80;
server_name bbs.aminglinux.com;
rewrite /(.*) http://www.aminglinux.com/bbs/$1 last;
.......

}
示例5(靜態(tài)請求分離)
server{
listen 80;
server_name www.aminglinux.com;
location ~ ^.+.(jpg|jpeg|gif|css|png|js)$
{
rewrite /(.
) http://img.aminglinux.com/$1 permanent;
}

.......

}
或者:
server{
listen 80;
server_name www.aminglinux.com;
if ( $uri ~ 'jpg|jpeg|gif|css|png|js$')
{
rewrite /(.
) http://img.aminglinux.com/$1 permanent;
}

.......

}

防盜鏈

示例6
server{
listen 80;
server_name www.aminglinux.com;
location ~ ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$
{
#白名單 空 blocked 域名
valid_referers none blocked server_names
.aminglinux.com aminglinux.com .aming.com aming.com;
if ($invalid_referer) #黑名單
{
rewrite /(.
) http://img.aminglinux.com/images/forbidden.png;
}
}

.......

}
說明:這里是通配,跟正則里面的不是一個意思,none指的是referer不存在的情況(curl -e 測試),
blocked指的是referer頭部的值被防火墻或者代理服務器刪除或者偽裝的情況,
該情況下,referer頭部的值不以http://或者https://開頭(curl -e 后面跟的referer不以http://或者https://開頭)。
或者:
location ~ ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$
{
valid_referers none blocked server_names
.aminglinux.com *.aming.com aminglinux.com aming.com;
if ($invalid_referer)
{
return 403;
}
}

偽靜態(tài)

示例7(discuz偽靜態(tài)):
location / {
rewrite ^([^.])/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^.]
)/forum-(\w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^.])/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^.]
)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^.])/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^.]
)/(fid|tid)-([0-9]+).html$ $1/index.php?action=$2&value=$3 last;
}

rewrite多個條件的并且

示例8:
location /{
set $rule 0; #定義一個變量
if ($document_uri !~ '^/abc')
{
set $rule "${rule}1"; # 01
}
if ($http_user_agent ~ 'ie6|firefox')
{
set $rule "${rule}2"; #02
}
if ($rule = "012")
{
rewrite /(.
) /abc/$1 redirect;
}
}

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI