需求
本來我們一般情況下都是域名abc.com解析到網站的根目錄/root/public這種。但是客戶突然提出了一個奇葩的需求,客戶要求以後可能網站會增多,需要增加分區的功能,比如abc.com/wh/代表武漢的網站,abc.com/sy/代表瀋陽的網站,如果打開域名會自動跳到某一個分區網站。
過程
1.路由轉發
因爲我用的框架是thinkphp5.0,有一個定義路由的功能,可以以路由的形式改變url然後達到轉發的效果。但是因爲網站整個搬過去的時候已經完工了,這個時候修改路由會導致整個網站所有的url發生變更,工作量很大。沒有一個工程師願意接這個活,所以只能想到服務器轉發,於是開始探索服務器轉發這個路子。
2.nginx重定向
然後想到了用nginx重定向的功能rewrite將請求到根目錄的請求全部轉發到分區/wh/中去,然後匹配/wh/的分區location,進行解析這個網站。但是很不幸,因爲定義了根目錄的原因,thinkphp5直接將/wh/解析成了一個模塊,然後就會報錯找不到wh這個模塊,資源加載也會自動j加上/wh/會導致所有資源加載不出來。其實是因爲請求轉發的時候解析有問題導致thinkphp5.0將/wh/解析成模塊了
後來在百度之後吸取了教訓,修改之後如下
終於能正常轉發域名到分區域名下,並且thinkphp5.0也能正常解析,但是資源因爲加了/wh/的原因不能正常加載了,如下圖
一片紅字,所有的資源被轉發只有無法正常解析
3.nginx重定向+資源重定向
因爲網頁已經能正常解析了,加班兩天的情況下不捨得放棄這個成果。於是研究這些靜態資源該怎麼辦,後來也是用location轉發的功能,讓靜態資源也能正常加載。如下圖
頁面可以正常顯示了
後記
以爲要完工的時候,測試之後發現了一個問題。接口的請求也被轉發了,因爲rewrite的原因導致post的參數全部丟失,無法獲取到正常的數據。後來嘗試用了反向代理,但是這樣的話地址欄url就不會發生改變,不符合客戶的需求。於是繼續問人、百度,終於發現一個大佬有過這個經歷,轉發之後參數丟失。在國外網站上找到了解決辦法,用nginx307重定向就解決了問題,經過測試完美解決這個問題。如下圖
這個時候接口也能請求了,然後完工。