5G時代,URL Rewrite 還吃香嗎


URL Rewrite是網站建設中經常用到的一項技巧,通過 rewrite 我們能夠屏蔽服務器運行態的信息,包括服務的程序、參數等等,給用戶呈現美化后的URL,同時對搜索引擎更加友好,方便我們網站的推廣。

rewrite 功能介紹

URL是互聯網上指定信息的唯一標志,URL Rewrite 就是常說的地址重寫,我們一般常說的地址重寫主要是針對 HTTP 或 HTTPS 協議,具體的場景有下面幾種。

  • 美化URL。不管使用哪種后台語言,多多少少會有一些能夠暴露技術特性的后綴,例如 .php.do 等等。URL重寫后,去掉了這些對於普通用戶難於理解的后綴,也有利於網站后台的安全。
  • 提高安全性。可以對一個域名下的所有服務進行重寫,只開放對外的服務。對於不開放服務的訪問,重定向到404或者500頁面,避免被人暴力猜解。
  • 有利於搜索引擎收錄。有些后台服務的功能很強大,但是為了按照業務拆分,我們可以設計一些后台並不存在的URL,利於搜索引擎的收錄和業務的開展。
  • 方便URL的重用一記后台服務的調整。如果我們后台進行了版本升級或者地址變更,都可以通過URL Rewrite對外部用戶屏蔽這些變化,極大的方便了網站的維護。

這些場景可以用下圖來概括說明。

有的朋友會發出疑問,在PC時代,大家首先面對的就是網站的地址,但是2020已經快要步入5G時代,大多數人都是通過手機APP來訪問互聯網上的各種內容。根據 CNNIC 《第46次中國互聯網絡發展狀況統計報告》顯示我國網民使用手機上網的比例達99.2%,而使用台式機和筆記本上網的網民比例分別是37.3%和31.8%。使用手機上網,很多情況下我們都是掃描一個二維碼或者點擊分享的鏈接就能打開頁面,而無需再記憶復雜的URL,那么是否可以說在5G時代,URL Rewrite 就不重要了呢?

實際上,網站服務除了被用戶訪問外,每天都會被搜索引擎、黑產分子不停的訪問,在5G時代即便用戶不需要手工輸入URL來訪問,合理利用URL Rewrite這項技術仍是每個網站開發人員、網站維護人員不可缺少的技能。

URL Rewrite的方法有很多,可以利用Apache、Nginx等中間件,也可以使用支持單入口的程序框架(例如PHP的Codeigniter)等,本文介紹如何使用Nginx來實現URL Rewrite的需求,畢竟Nginx近年來的發展勢頭那真是勢不可擋。

nginx rewrite

Nginx提供了rewrite功能,結合正則表達式和標志位實現URL的重寫與重定向,正則規則采用PCRE(PERL兼容的正則表達式語法規則)。

如果需要正則功能,在編譯Nginx之前,需要編譯安裝PCRE庫。

rewrite 規則只能放在server{},location{},if{}中,並且只能對域名后邊除去傳遞的參數外的字符串起作用。。

rewrite 語法

rewrite 是實現URL重寫的關鍵,根據正則表達式的內容,重新定向到replacement指定的URL,根據末尾的flag參數不同,決定后續的處理動作。

指令語法 rewrite regex replacement [flag]
默認值 none
應用位置 server、location、if

簡單的示例:

# URL實現偽靜態,將動態參數變為URL中的字符串
rewrite ^/users/(.*)$ /show.php?user=$1? last;

# 實現不同語言網站的跳轉
rewrite ^/cn/(.*)$ /cn/$1 break;
rewrite ^/jp/(.*)$ /jp/$1 break;

# 將所有的請求都定向到 baidu.com
rewrite ^/(.*) http://www.baidu.com/ permanent;

在Nginx的配置中,優先執行 server 塊中的 rewrite 指令,然后再執行 location 塊中的 rewrite 指令。最后再執行選定的 location 中的 rewrite 指令。

flag標記

flag標記符號 說明
last 本條規則匹配完成后,繼續向下匹配新的 location URI 規則,瀏覽器地址欄URL地址顯示原來的地址
break 本條規則匹配完成即終止,不再匹配后面的任何規則,瀏覽器地址欄URL地址顯示原來的地址
redirect 返回302臨時重定向,瀏覽器地址欄會顯示跳轉后的URL地址
permanent 返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址

在flag標記中,lastbreak 實現功能類似,使用 alias 指令時必須用 last 標記,使用 proxy_pass 指令時要使用 break 標記。last 標記在本條 rewrite 規則執行完畢后,會對其所在的 server{…} 標簽重新發起請求,而 break 標記則會在本條規則匹配完成后,終止匹配,不再匹配后面的規則。

實戰案例

本文提供了一個基於 docker 的演示案例,將上文的場景一一演示出來。通過訪問 我的Github 可以獲得全部的 docker 編排文件及代碼。

不太熟悉 Docker 的同學可以參考 使用 Docker 快速搭建LNMP開發環境,讓你在安裝了 Docker 的情況下,使用一條命令就快速搭建LNMP開發環境。還要了解更多 Docker 的內容,可以查看 Docker 系列文章

主要的語法如下

rewrite ^/login$ /login.php last;
rewrite ^/register$ /register.php last;
rewrite ^/search$ /search.php last;
rewrite ^/discount/student$ /discount.php?u=d last;
rewrite ^/discount/teacher$ /discount.php?u=t last;

Nginx Rewrite 還有更多強大的功能,等待大家去探索,歡迎關注我的公眾號與我進行交流探討。

參考資料

  1. IETF RFC 1630
  2. Ngx_http_rewrite_module
  3. nginx中try_files
  4. Nginx rewrite or internal redirection cycle while internally redirecting
  5. Nginx rewrite


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM