Nginx 實現 Rewrite 跳轉
文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。
上一篇文章對Nginx的Location配置進行了講解,本篇主要對於Nginx中的Rewrite跳轉進行講解。因為目前很多工作前端開發都會選擇使用Nginx作為反向代理伺服器,但是平時業務需要難免碰到重寫URL,Nginx的Rewrite跳轉有什麼使用場景呢?
- 公司更換域名需要訪問舊域名時跳轉到新域名
- 請求靜態檔案跳轉到CDN
- 根據使用者裝置不同跳轉到不同站點(pc端,移動端)
不得不說的是Apache伺服器規則庫很強大,做跳轉也很簡單,但是Nginx使用Rewrite實現跳轉效率更高,所以這也是我們需要學習Nginx的Rewrite模組的目的所在。Rewrite是Nginx的靜態重寫模組,跳轉的使用場景有以下幾種情形:
- 可以改變使用者訪問的URL
- 可以將動態URL偽裝成靜態URL提供服務
- 可以訪問舊域名時跳轉到新域名
- 可以根據變數,目錄,客戶端資訊等跳轉不同的URL
Rewrite如何實現跳轉?
Nginx利用ngx_http_rewrite_module模組解析和處理rewrite請求。Rewrite用於實現URL重寫,其實有點類似於重定向功能,可以將使用者的請求重寫至別的目錄,在一定程度上提高了網站安全性。Rewrite支援if條件判斷,但不支援else判斷。而且Rewrite需要PCRE支援,一次重定向最多可以跳轉10次,超過10次將返回500錯誤。Rewrite模組包含set命令,可以建立變數用來記錄條件標識或者傳遞變數到其他的Location中。Rewrite實際上就是使用Nginx已有的全域性變數或者通過set命令設定的變數結合正則表示式實現URL重寫。
Rewrite使用場景
在Nginx中使用Rewrite實現跳轉有以下三種場景:
- 直接用Rewrite進行匹配跳轉
- 使用if匹配全域性變數進行跳轉
- 使用location匹配再進行跳轉
所以說rewrite語句只允許放在server{ },if{ },location{ }中。接下來我們先看看if指令。
if指令
if指令用於條件匹配判斷,根據判斷結果選擇不同的Nginx配置,在server或location中配置。Nginx中的if指令只支援單重判斷,不支援多重判斷。我們簡單看個例子:
location /test{
> index index.html;
if ( $scheme = http ){ rewrite / https://www.niyueling.cn permanent; } if ($scheme = https ){ echo "if ---> $scheme"; }
}
location上篇文章講過了,這裡不再細講,接下來我們看下rewrite語法.
rewrite語法
- rewrite regex replacement [flag]
rewrite將使用者請求的URL基於正則表示式regex進行檢查,匹配到時將其替換為正則表示式對應的新的URL。若在同一級配置模組中存在多個rewrite規則,則會自頂向下檢查。replacement則為跳轉後的內容。[flag]作為識別符號用於控制迴圈機制,如果替換後的URL是以http或者https開頭,則會直接301永久重定向。
flag引數介紹
rewrite語句有四種flag狀態:redirect、permanent、break、last。前兩種屬於客戶瀏覽器重新發起對新地址的請求,後兩種是在WEB伺服器內部實現跳轉。
- redirect #臨時重定向,重寫完成後以臨時重定向方式直接返回重寫後生成的新URL給客戶端,有客戶端重新發起請求,使用相對路徑,http://或https://開頭,狀態碼:302
- permanent #永久重定向,以永久重定向的方式直接返回重寫後生成的新URL給客戶端,由客戶端重新發起新的請求,狀態碼:301
- last #重寫完成後停止對當前location中後續的其他重寫操作,而後對新的URL啟動新一輪重寫檢查,不建議在location中使用
- break #重寫完成後停止對當前URL在當前location中後續的其他重寫操作,而後直接跳轉至重寫規則匹配塊之後的其他配置;結束迴圈,建議在location中使用
rewrite語法講完了我們可以一起來看看如何實現幾種方式跳轉:
(1) 在location中將舊域名永久重定向到新域名
location / {
root /data/html;
index index.html;
rewrite / http://www.niyueling.cn permanent;
}
這裡有必要提下臨時重定向與永久重定向的區別:
臨時重定向不會快取新域名的解析記錄,但是永久重定向會快取新域名的解析記錄。
(2) http自動跳轉https
有時候公司專案需要,會要求整個網站皆使用https,這時候為了使用者體驗,我們需要在使用者訪問http站點的時候自動跳轉到https站點中。
location / {
> root /opt/blog;
index index.html;
if ( $scheme = http ){
rewrite / https://www.niyueling.cn permanent;
}
}
上面配置其實就是如果使用者請求協議為http的時候使用rewrite跳轉到對應的https站點。但是if語句不能去掉,否則就會陷入死迴圈。
(3) 如果使用者請求URL不存在跳轉首頁
location / {
root /opt/blog;
index index.html;
if ( !-f $request_filename ){
rewrite (.*) http://www.niyueling.cn;
}
}
(4) 實現防盜鏈
防盜鏈實際上是基於前端攜帶的referer實現,referer可以記錄使用者從哪個介面跳轉而來的標誌資訊。Nginx可以通過ungx_http_referrer_module模組來檢查請求的referer資訊是否有效實現防盜鏈功能
location ^~ /test {
root /opt/blog;
index index.html;
valid_referers none blocked server_names .niyueling.cn www.niyueling.
api.online.test/v1/hostlist ~.google. ~.baidu.; #定義有效的referer
if ($invalid_referer) { #假如是使用其他的無效的referer訪問:
return 403; #返回狀態碼403
}
}
如果喜歡我的文章,歡迎關注我的個人公眾號
相關推薦
Nginx 實現 Rewrite 跳轉
文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。 上一篇文章對Nginx的Location配置進行了講解,本篇主要對於Nginx中的Rewrite跳轉進行講解。因為目前很多工作前端開發都會選擇使用Nginx作為反向代理伺服器,但是平時業務需要難免碰到重寫URL,Ng
nginx實現301跳轉
ros 全部 bsp 配置文件 nginx服務 firewalld 結果 ble nginx -t 我們用nginx實現301跳轉,下面我們先講一下實現的大概思想,首先我們用yum或者編譯安裝nginx,然後配置nginx的主配置文件的子文件,(在配置子文件的時候可以把默認
nginx rewrite 實現URL跳轉
最近工作中常常要改nginx配置,學習了nginx中rewrite的用法 URL跳轉 這裡說的URL跳轉就是使用者在訪問一個URL時將其跳轉到另一個URL上。 常見的應用場景是讓多個域名跳轉到同一個URL上,(例如讓舊域名跳轉到新域名上) 將靜態檔案請求跳轉到cdn上等
php中實現頁面跳轉的幾種方式
腳本 timeout location clas replace asc idt lee 實現 親測,not復制粘貼 PHP中實現頁面跳轉有一下幾種方式,看了幾個人寫的不是很條理,自己整理一下 在PHP腳本代碼中實現 <?php header("locati
nginx配置http跳轉https
文件 簡單 div 文件頭部 配置 gin list ... 需要 配置相當簡單,在配置文件頭部加一行,如下: server { listen *:80;//監聽80端口 return 301 htt
Python 利用socket 實現 ssh 跳轉
socket python squid 1.場景描述:主機A主機B主機C10.13.170.76172.28.117.156(squid)10.95.113.131 主機A---->主機B(80)--->主機C(22), A通過B的80訪問主機C131 2.Python代碼;im
ui li 形式的菜單 實現頁面跳轉
頁面跳轉 app /*跳轉*/ jumpEditRectificatBill:function(){ $("#getEquipLegerFrom li").each(function(){ //var jumpid=$(this).attr("id")
html中提交表單並實現不跳轉頁面處理返回值
html value put 提示 pan sdn type detail all <html> <head> <script type="text/javascript" src="h
from表單實現無跳轉上傳文件,接收頁面後臺數據
spl white lis not left alt tro pos ftp 實現無跳轉發送表單數據、文件,並能接收後臺返回的數據。 主要技術要點: 1、form表單添加target屬性,指定一個iframme的name;form表單提交後在iframe內嵌窗口
不同終端實現自動跳轉到相應頁面的js代碼
get cati string type clas 實現 www oca pac 1 2 3 4 <script type="text/javascript"> if(/Android|webOS|iPhone|iP
用js實現頁面跳轉的幾種方式
head 註意 ont rem text pla http bsp cat 通過js或者html或者PHP等動態程序都可以方便的實現跳轉,這裏搜集了幾種頁面跳轉的方式js方式的頁面跳轉1.window.location.href方式 <script langua
nginx填坑補充(nginx根據上下文跳轉ip或者域名)
store access allow tro 跳轉 head 不同的 域名 root 今天有一個需求,要根據上下文調到不同的ip或域名地址,使用上下文做域名跳轉的時候,proxy_pass域名後面一定要帶‘/’否則會把nginx的上下文自動帶入,這樣就行。 location
寶塔Linux nginx http強制跳轉https幾種設置方法
http轉https SSL證書的申請 SSL證書設置 最近很多人都比較關註SSL證書的申請與設置,春哥技術博客近期也為大家介紹了國內一些免費SSL證書申請流程及比較常用的VPS建站環境包如何安裝配置SSL證書。希望有需要的朋友能成功為自己的站點安裝SSL證書。在這裏春哥為大家分享幾種Nginx環
ASP.NET MVC中如何實現頁面跳轉
pub ring 項目 再見 name ati 方法 技術 mod 1,最簡單的方式:超鏈接 以下分別是連接到HomeController控制器下的SharpL動作方法,以及百度首頁。代碼如下: 1 <a href="Home\SharpL">打開S
nginx通過url跳轉到另外的一個url上
cti AS pass oot process url跳轉 .html body lis #user nobody;worker_processes 1; events {worker_connections 1024;} http {sendfile
nginx 重定向跳轉和不跳轉兩種需求
匹配 rman ebs url 日常 oca baidu perm 正則 背景:在日常運維中經常會碰到需要從一個鏈接跳轉到另一個鏈接的情況,此類需求分為兩種情況,一種是瀏覽器url變,一種是瀏覽器url不變。 一、Url變,使用nginx rewirte模塊 rewrite
nginx配置域名跳轉
gin 域名跳轉 cati include nginx 配置 roo perm 域名 ref nginx 配置主域名 xxx.com, 跳轉子域名 www.xxx.com server {listen 80;server_name www.xxx.com;
vue 實現路由跳轉
1.前一節已經安裝了vue-router(npm install vue-router --save),現在就來使用一下 1)先在App.vue元件中配置路由出口 <template> <div id="app"> <div class="conta
IIS8 通過web.config 實現http跳轉到https
安裝url重寫2.0之後, 編輯web.config <configuration> <system.webServer> <rewrite> <rules> &l
php實現頁面跳轉方法彙總
一共有三種方法實現頁面跳轉,分別利用php提供的header()、html meta標籤、JavaScript指令碼。 header() header()方法通過設定http響應頭中的location域實現跳轉。這種跳轉實現對使用者是不可見的,有瀏覽器直接執行