nginx URL重寫

来源:http://www.cnblogs.com/f-ck-need-u/archive/2017/10/18/7685485.html
-Advertisement-
Play Games

本文目錄: 1.1 URL重寫簡介1.2 if指令1.3 rewrite指令1.4 URL重寫和反向代理的區別 1.1 簡介 url重寫由ngx_http_rewrite_module模塊提供,預設會安裝,但該模塊功能的實現需要pcre。URL重寫技術不僅要求掌握幾個指令的語法、熟悉簡單的正則表達式 ...


本文目錄:

1.1 URL重寫簡介
1.2 if指令
1.3 rewrite指令
1.4 URL重寫和反向代理的區別

1.1 簡介

url重寫由ngx_http_rewrite_module模塊提供,預設會安裝,但該模塊功能的實現需要pcre。URL重寫技術不僅要求掌握幾個指令的語法、熟悉簡單的正則表達式,還需要儘量熟悉nginx的各個變數的意義,熟悉的變數越多越好。大多數需要用到的變數都是http_core模塊提供的,它們的意義參見官方手冊http_core內置變數

rewrite模塊主要有break、return、set、rewrite和if這5個指令。

  • break的作用是完成當前的作用集,不再執行rewrite指令
  • return返回狀態碼。可用的狀態碼有204/301/302/303/307/308/400/402-406/408/410-411/413/416/500-504。return三種語法:
    return code [text];
    return code URL;
    return URL;
    
  • set用於定義變數。賦給變數的值可以是一個變數、文本及文本變數的組合(語法:set variable value;)
  • if用於設定判斷條件。格式為if (condition) {}
  • rewrite用於設定URL重寫規則(語法:rewrite regex replacement [flag];)

1.2 if指令

if不支持嵌套,不支持"&&"和"||"多目運算符。語法為:

if (condition) {}

測試條件可以如下定義:

(1). 變數的比較可以使用"="和"!="運算符。
(2). 正則匹配可以使用"~"和"~*",前者表示區分大小寫的正則匹配,後者表示不區分大小寫的匹配。
(3). 正則匹配可以在前面加上感嘆號"!~"和"!~*"表示取反,即不匹配。
(4). "-f"和"!-f"判斷文件是否存在。
(5). "-d"和"!-d"判斷目錄是否存在。
(6). "-e"和"!-e"判斷文件或目錄或軟鏈接是否存在。
(7). "-x"和"!-x"判斷文件是否可執行。

if支持的正則表達式可以使用$1至$9來實現反向引用。

以下為幾個示例:

# 當使用IE瀏覽器訪問時,重定向到/msie/目錄下的對應文件
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

# 當http請求的方法為POST,則直接返回405狀態碼,即Method not Allowed
if ($request_method = POST) {
    return 405;
}

# 當請求的資源文件不存在,則直接退出當前匹配,並代理至本機,這種情況下由本機來提供服務,如提供錯誤頁面
if (!-f $request_filename) {
    break;
    proxy_pass http://127.0.0.1;
}

# 當訪問的是longshuai.com下任意主機,則重定向到www.longshuai.com主機下的對應目錄
if ($http_host ~* "^(.*)\.longshuai\.com$") {
    set $domain $1;
    rewrite ^(.*) http://www.longshuai.com/$domain/ break;
}

上面最後一種URL重寫後的URL為一個新的主機名站點,但使用URL重寫的效率比較低下,遠不如直接為此站點獨立定義一個虛擬主機。所以改寫為:

server {
    listen 80;
    server_name .longshuai.com;
    return 302 http://www.longshuai.com/$request_uri;
}

server {
    listen 80;
    server_name www.longshuai.com;
}

1.3 rewrite指令

rewrite可以寫在server段、location段和if段。語法:

rewrite regexp replacement [flag]

如果replacement部分以"http://"或"https://"或"$schema"開頭,則直接臨時重定向,見下表中的redirect標記。

flag是標記。有4種標記,它們的作用如下表。

flag說明
last 停止處理當前上下文中的其他重寫模塊指令,併為重寫後的uri再次進行上下文的匹配
break 和break指令一樣,都是停止處理當前上下文中的其他重寫模塊指令
redirect 返回臨時重定向狀態碼302。當replacement部分不是以"http://"或者"https://"或者"$schema"開頭的時候使用,"$schema"變數表示使用的是什麼協議
permanent 返回永久重定向狀態碼301

以上flag中,last和break用來實現URL改寫,此時瀏覽器中的地址不會改變,但實際上在伺服器上訪問的資源和路徑已經改變了。redirect和permanent用來實現URL跳轉,瀏覽器中的地址會改變為跳轉後的地址

在使用proxy_pass指令時要使用break標記。last標記在本條rewrite規則執行完後,繼續在當前上下文對重寫後的地址發起匹配請求,而break則在本次匹配完成後停止再次匹配。例如下麵的兩條重寫規則。

rewrite "^/bbs/(.*)/images/(.*)\.jpg$" www.longshuai.com/bbs/$2/images/$1.jpg last;
rewrite "^/bbs/(.*)/images/(.*)\.jpg$" www.longshuai.com/bbs/$2/images/$1.jpg break;

如果訪問的是www.longshuai.com/bbs/a/images/b.jpg則重寫後為www.longshuai.com/bbs/b/images/a.jpg,但是重寫後的地址仍然可以匹配到規則^/bbs/(.*)/images/(.*)\.jpg$,此時如果使用last標記,則會再次進行重寫,最終導致URL重寫迴圈,nginx預設支持10次迴圈,然後返回500狀態碼。而如果使用break標記,則在重寫完成後不會再次匹配重寫。

例如,下麵的重寫示例將會使得任意以longshuai.com結尾的訪問重定向到www.longshuai.com。

server_name  www.longshuai.com;
rewrite (.*).longshuai.com www.longshuai.com permanent;

下麵的重寫實例將使得www.longshuai.com/bbs/*的訪問都重定向到www.longshuai.com/forum/*。

server {
    listen 80;
    server_name www.longshuai.com;
    location /{
        root /www/longshuai/;
        index index.html;
        rewrite "/bbs/(.*)" "/forum/$1" last;
    }
}

1.4 URL重寫和反向代理的區別

URL重寫和反向代理都能將請求轉發到其他主機上。但它們有很大的區別。

1.URL重寫可以實現一些反向代理不能實現的轉發。
2.URL重寫可以實現瀏覽器地址改變。
3.反向代理更多的配合upstream實現負載均衡。URL重寫無法直接通過轉發實現負載均衡。
4.還有很多其他的區別,無需關心它們的區別,當某種需求既可以URL重寫實現,也可以反向代理實現,隨便用一種方法即可。

回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html

回到資料庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html

轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7685485.html

註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • cut是以每一行為一個處理對象的,這種機制和sed一樣。 cut接受三個定位方法: 1)byte: -b 2)characters: -c 3)fields: -d eg:提取第3,4,5,9的位元組: cut -b 3-5,9 註意:cut命令如果使用-b選項,執行時會先把-b後面所有的定位進行從小 ...
  • Extmail是一種WebMail程式,功能強大,本文介紹另一個功能更加人性化的WebMail程式roundcube。 1.下載安裝roundcube 2.升級安裝php相關模塊 修改一下php.ini中的時區配置 3.配置webmail的虛擬主機,需要配置下功能變數名稱解析 配置完成重啟apache 4. ...
  • 服務端埠號變化了,如何基於秘鑰分發連接;如何實現自動創建秘鑰對,同時分發公鑰(編寫腳本實現) ...
  • linux是企業最常用的伺服器系統之一,CentOS是免費的,所以用的企業也挺多,今天給大家分享怎麼在自己電腦的虛擬機中安裝CentOS-6.5,以便用來玩耍,沒事的時候可以學學linux的一些知識。 1.下載CentOs安裝鏡像盤 下載地址:https://www.centos.org/downl ...
  • ********mysql******** 所需要的rpm文件: (https://downloads.mysql.com/archives/community) MySQL-client-5.5.48-1.linux2.6.x86_64.rpm MySQL-server-5.5.48-1.linu ...
  • 樹莓派Raspbian玩耍 安裝樹莓派並通過花生殼實現內網穿透 ...
  • #前提條件: 宿主機:windows7 虛擬機:REDHAT 開發環境 qt4.7.4 +vs2010 。 代碼在windows7 上編譯成功 ,運行正常 在linux下編譯需要的第三方庫已經編譯成功放在同一目錄,(其中建立不同版本的庫的軟鏈接) #目的:在linux上從新編譯。 #步驟:在虛擬機上 ...
  • 首先sudo su到root用戶 終端輸入 1. apt-get install mysql-server 2.apt-get isntall mysql-client 3.apt-get install libmysqlclient-dev 檢查MySQL狀態 netstat -tap | gre ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...