<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家在瀏覽某些網站的時候,有沒有發現,當輸入:www.abc.com或者www.abcd.com的時候,頁面均能正常顯示www.abc.com的主頁內容。這就是nginx rewrite的一個使用場景。
rewrite是Nginx伺服器提供的一個重要基本功能,主要作用用來實現URL地址重寫
rewrite功能實現依賴於pcre的支援,因此在編譯安裝Nginx伺服器之前,需安裝pcre庫(nginx使用ngx_http_rewrite_module模組來解析和處理Rewrite功能的相關設定)
在真正瞭解rewrite的使用之前,有必要全面系統學習下rewrite相關的指令和語法使用,下面來逐一瞭解下吧
該指令用來設定一個新的變數。
一個簡單的案例
server { listen 8081; server_name localhsot; location /server { set $name zhangsan; set $age 19; default_type text/plain; return 200 $name=$age; } }
重啟nginx服務,然後瀏覽器存取觀察下效果
下面列舉了Rewrite常用全域性變數
這些變數可以在使用過程中結合自身的業務靈活選擇使用
變數 | 說明 |
---|---|
$args | 變數中存放了請求URL中的請求指令。如http://IP:8080?arg1=value1&args2=value2中 的"arg1=value1&arg2=value2",功能和$query_string一樣 |
$http_user_agent | 變數儲存了使用者存取服務的代理資訊(如果通過瀏覽器存取,記錄的是瀏覽器的相關版本資訊) |
$host | 變數儲存的是存取伺服器的server_name值 |
$document_uri | 變數儲存了當前存取地址的URI。比如http://IP/server?id=10&name=zhangsan中的"/server",功能和$uri一樣 |
$document_root | 變數儲存的是當前請求對應location的root值,如果未設定,預設指向Nginx自帶html目錄所在位置 |
$content_length | 變數儲存的是請求頭中的Content-Length的值 |
$content_type | 變數儲存的是請求頭中的Content-Type的值 |
$http_cookie | 變數儲存的是使用者端的cookie資訊,可以通過add_header Set-Cookie’cookieName=cookieValue’來新增cookie數 據 |
$limit_rate | 變數中儲存的是Nginx伺服器對網路連線速率的限制,也就是Nginx設定中對limit_rate指令設定的值,預設是0,不限制 |
$remote_addr | 變數中儲存的是使用者端的IP地址 |
$remote_port | 變數中儲存了使用者端與伺服器端建立連線的埠號 |
$remote_user | 變數中儲存了使用者端的使用者名稱,需要有認證模組才能獲取 |
$scheme | 變數中儲存了存取協定 |
$server_addr | 變數中儲存了伺服器端的地址 |
$server_name | 變數中儲存了使用者端請求到達的伺服器的名稱 |
$server_port | 變數中儲存了使用者端請求到達伺服器的埠號 |
$server_protocol | 變數中儲存了使用者端請求協定的版本,比如"HTTP/1.1" |
$request_body_file | 變數中儲存了發給後端伺服器的本地檔案資源的名稱 |
$request_method | 變數中儲存了使用者端的請求方式,比如"GET","POST"等 |
$request_filename | 變數中儲存了當前請求的資原始檔的路徑名 |
$request_uri | 變數中儲存了當前請求的URI,並且攜帶請求引數,比如http://IP/server?id=10&name=zhangsan中的"/server?id=10&name=zhangsan名 |
我們來隨機測試下幾個指令的使用吧
$args
server { listen 8081; server_name localhsot; location /server { set $name zhangsan; set $age 19; default_type text/plain; return 200 $name=$age=$args; } }
$http_user_agent
其他的指令有興趣的同學可以自行嘗試,下面使用這些指令完成一個需求
自定義紀錄檔輸出格式,將請求的紀錄檔輸出到自定義的紀錄檔中
具體設定如下:
log_format main '$remote_addr - $request - $status - $request_uri - $http_user_agent'; server { listen 8081; server_name localhsot; location /server { access_log logs/access-server.log main; set $name zhangsan; set $age 19; default_type text/plain; return 200 $name=$age=$args=$http_user_agent; } }
通過這種方式,就可以實現自定義請求的相關引數輸出到自定義的紀錄檔檔案中
該指令用來支援條件判斷,並根據條件判斷結果選擇不同的Nginx設定
condition為判定條件,可以支援以下寫法:
1)變數名稱,如果變數名對應的值為空或者是0,if都判斷為false,其他條件為true
if ($param) { }
location /testif { set $username 'zhangsan'; default_type text/plain; if ($username){ return 200 success; } return 200 'params is empty'; }
2) 使用"=“和”!="比較變數和字串是否相等,滿足為true,不滿足為false
if ($request_method = POST) { return 405; 3 }
注意:此處和Java不一樣的是字串不需加引號
3)使用正規表示式對變數匹配
if ($http_user_agent ~ MSIE) { #$http_user_agent的值中是否包含MSIE字串,如果包含返回 true }
注意:正規表示式字串一般不需要加引號,但是如果字串中包含"}“或者是”;"等字元時,就需要把引號加上
if ($http_user_agent ~ Safari){ return 200 Chrome; }
4)判斷請求檔案是否存在使用"-f"和"!-f"
if (-f $request_filename){ #判斷請求的檔案是否存在 } if (!-f $request_filename){ #判斷請求的檔案是否不存在 }
案例展示
location /file { root html; default_type text/html; if (!-f $request_filename){ return 200 '<h1>not find file</h1>'; } }
當存取目錄下不存在的檔案時,將會看到如下的異常返回
5) 判斷請求的目錄是否存在使用"-d"和"!-d"
6) 判斷請求的目錄或者檔案是否存在使用"-e"和"!-e"
7) 判斷請求的檔案是否可執行使用"-x"和"!-x"
該指令用於中斷當前相同作用域中的其他Nginx設定。與該指令處於同一作用域的Nginx設定中,位於它前面的指令設定生效,位於後面的指令設定無效
location /{ if ($param){ set $id $1; break; limit_rate 10k; } }
案例演示
location /break { default_type text/plain; set $username MIKE; if ($args){ set $username JIM; break; set $username JODAN; } return 200 $username; }
該指令用於完成對請求的處理,直接向用戶端返回響應狀態程式碼。在return後的所有Nginx設定都是無效的
location /return { default_type application/json; return 200 '{id:1,name:jike}'; }
該指令通過正規表示式的使用來改變URI。可以同時存在一個或者多個指令,按照順序依次對URL進行匹配和處理
last break redirect permanent
last : 終止繼續在本location中處理接收到的URI,並將此處重寫的URI作為一個新的URI,使用各location塊進行處理。該標誌將重寫的URI重寫在server塊中執行,為重寫後的URI提供了轉入到其他location塊的機會;
break : 將此處重寫的URI作為一個新的URI,在本塊中繼續處理,該標誌重寫後的地址在當前的location塊中執行,不會將新的URI轉向其他的location塊;
redirect : 將重寫後的URI返回給使用者端,狀態碼為302,指明是臨時重定向URI,主要用在replacement變數不是以 “http://”或“https://”開頭的情況;
redirect : 將重寫後的URI返回給使用者端,狀態碼為302,指明是臨時重定向URI,主要用在replacement變數不是以 “http://”或“https://”開頭的情況;
permanent : 將重寫後的URI返回給使用者端,狀態碼為301,指明是臨時重定向URI,主要用在replacement變數不是以 “http://”或“https://”開頭的情況;
範例1
location /rewirte { rewrite ^/rewrite/urlw*$ https://www.baidu.com; rewrite ^/rewrite/(test)/w*$ /$1; rewrite ^/rewrite/(hello)/w*$ /$1; } location /test { default_type text/plain; return 200 "hello success"; }
範例2
location /rewirte { rewrite ^/rewrite/urlw*$ https://www.baidu.com; rewrite ^/rewrite/(test)/w*$ /$1 last; rewrite ^/rewrite/(hello)/w*$ /$1 last; } location /test { default_type text/plain; return 200 "hello success"; }
該指令設定是否開啟URL重寫紀錄檔的輸出功能
開啟後,URL重寫的相關紀錄檔將以notice級別輸出到error_log指令設定的紀錄檔檔案彙總
location /rewirte { rewrite_log on; error_log logs/error.log notice; rewrite ^/rewrite/urlw*$ https://www.baidu.com; rewrite ^/rewrite/(test)/w*$ /$1 last; rewrite ^/rewrite/(hello)/w*$ /$1 last; }
有很多大型網站,在起步的時候,比如域名為 : www.haoyijia.com,但是域名太長所帶來的問題就是不方便記憶,於是後面改成 www.hyj.com,問題是,一些老使用者之前一直習慣了那個長域名,如何在老使用者輸入長域名的時候仍然可以跳轉到新的短域名上呢?就可以考慮使用rewrite的功能;下面在本地做一下模擬。
設定步驟:
這裡我直接在本地模擬2個域名,通過在原生的hosts檔案設定下就可以了
server { listen 80; server_name www.zcy.com www.zhangcongyi.com; rewrite ^/ http://www.jd.com permanent; }
重啟nginx服務,瀏覽器存取:www.zcy.com 或者www.zhangcongyi.com,觀察效果
一個完整的專案包含多個模組,比如購物網站有商品商品搜尋模組、商品詳情模組、購物車模組等,那麼我們如何為每一個模組設定獨立的域名。
server{ listen 80; server_name search.hm.com; rewrite ^(.*) http://www.hm.com/bbs$1 last; } server{ listen 81; server_name item.hm.com; rewrite ^(.*) http://www.hm.com/item$1 last; } server{ listen 82; server_name cart.hm.com; rewrite ^(.*) http://www.hm.com/cart$1 last; }
原生的hosts檔案新增如下設定
重啟nginx服務,可以在瀏覽器存取下觀察效果如何
搜尋引擎優化(SEO)是一種利用搜尋引擎的搜尋規則,來提供目的網站的有關搜尋引擎內排名的方式;
我們在建立自己的站點時,可以通過很多種方式有效提供搜尋引擎優化的程度,其中有一項就包含URL的目錄層級一般不要超過三層,否則的話不利於搜尋引擎的搜尋也給使用者端的輸入帶來了負擔;
但是將所有的檔案放在一個目錄下又會導致檔案資源管理混亂,並且存取檔案的速度也會隨著檔案增多而慢下來,這兩個問題是相互矛盾的,使用rewrite就可以解決上述問題;
舉例,網站中有一個資原始檔的存取路徑時,比如存取:/server/11/22/33/44/20.html,也就是說20.html存在於第5級目錄下,如果想要存取該資原始檔,使用者端的URL地址就要寫成http://www.web.name/server/11/22/33/44/20.html;
server { listen 80; server_name www.web.com; location /server{ root html; } }
但是這個是非常不利於SEO搜尋引擎優化的,同時使用者端也不好記,使用rewrite我們可以進行如下設定:
server { listen 80; server_name www.web.com; location /server{ rewrite ^/server-([0-9]+)-([0-9]+)-([0-9]+)- ([0-9]+).html$ /server/$1/$2/$3/$4/$5.html last; } }
到此這篇關於nginx rewrite功能使用的文章就介紹到這了,更多相關nginx rewrite使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45