怎么利用Nginx實現URL重定向

    1. 概述

    老話說的好:取乎上,得其中;取乎中,得其下。因此我們不妨把目標定的高一些,去努力,才能得到更好回報。

    2. 使用 nginx 實現 URL 的重定向

    2.1 使用場景

    我們日常分享一個網站地址時,常常會有這樣的效果,同樣一個網址,在電腦的瀏覽器打開,是一種效果,而在手機的瀏覽器打開,就會展現出另一種更適合手機顯示的效果。

    通常要達到這樣的效果,有兩種方式實現:

    一、使用自適應的 H5 頁面實現,根據窗口寬度的大小,自動調整頁面的布局。

    二、使用Nginx,依據終端的不同,跳轉到不同的頁面,電腦打開,跳轉到 PC端 使用的網頁,手機打開,跳轉到 手機端 使用的網頁。

    今天我們介紹一下第二種方式,是如何實現的。

    2.2 單純的重定向

    有些 URL 的重定向,新 URL 不需要繼承原 URL 的參數,例如 網站首頁,這種情況,在 Nginx 配置文件的 location 中使用 return 302 的方式進行跳轉即可。

    location?/?{ ????????#?判斷是否是移動端 ????????if?(?$http_user_agent?~?"(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows?CE)|(Wget)|(Java)|(curl)|(Opera)"?) ????????{ ????????????return?302?https://www.zhuifengren.com/h6/index.html; ????????} ? ????????proxy_pass?http://myUpstream; ?}

    2.3 依據原 URL 重定向

    另一種情況就是 新 URL 需要繼承原 URL 的參數,這種情況就需要使用 ?rewrite 對 URL 進行改寫。

    location?/?{ ????????#?判斷是否是移動端 ????????if?(?$http_user_agent?~?"(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows?CE)|(Wget)|(Java)|(curl)|(Opera)"?) ????????{ ????????????rewrite?(w+-w+)|(?.*)$?https://www.zhuifengren.com/h6-$1-0.html$2?redirect;???????? ????????}???? ? ????????proxy_pass?http://myUpstream; }

    rewrite 的語法是: rewrite ?正則表達式 ?改寫后的URL ?redirect;

    其中 redirect 是 302 臨時重定向的意思,也可以使用 permanent 關鍵字,代表 301 永久重定向。

    使用 rewrite 對 URL 進行改寫,需要用到 正則表達式 的知識,改寫后 URL 中的 $1、$2 代表正則表達式中匹配的第一個字符串和第二個字符串,這里大家可以去了解一下正則表達式,就不細說了。

    例子中的正則表達式 (w+-w+)|(?.*)$,可以將原 URL:

    重寫:這是一個鏈接,鏈接地址為 https://www.zhuifengren.com/1001-1223.jsp?v=123456

    改寫為

    https://www.zhuifengren.com/h6-1001-1223-0.html?v=123456

    補充:Nginx根據url參數重定向

    1.判斷url路徑

    location?/?{ ????if?($args?~*?"/product-list?param1=val1&param2=val2")?{ ????????rewrite?^?http://www.mysite.com/product-list/$arg_param1/$arg_param2??last; ????} }

    2. 判斷url參數

    if?($arg_path?=?'abc'){ 	proxy_pass?http://127.0.0.1/abc/$arg_path; }

    需要特別注意的是,由于if語句的不穩定性,nginx并不支持多個if判斷,也不支持類似于or的邏輯判斷,因此只能采用下文所述的方法。

    location?/api/?{ ????????if?($arg_token?=?'')?{ ????????	proxy_pass?http://127.0.0.1/abc ????????} ????????if?($http_token?=?'')?{ ?????????????proxy_pass?http://127.0.0.2/abc ????????} ????????if?($token?=?paraheader)?{ ????????	?proxy_pass?http://127.0.0.3/abc ????????} ????????proxy_pass?http://127.0.0.1:8080/app/; ????????proxy_redirect?off; ????}

    ? 版權聲明
    THE END
    喜歡就支持一下吧
    點贊14 分享