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 ^/(.*) //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
Tags: