摘要:適配路由問題絕對能用的一篇配置,文末直接有文件,伸手黨直接拿走本文環(huán)境比較復(fù)雜,首先兩層轉(zhuǎn)發(fā),并且訪問路徑也不是根路徑。不對做編碼,因此請求為,可以被規(guī)則匹配到注意是空格。配置錯誤解決優(yōu)先級問題后,問題依然存在。導(dǎo)致找不到請求。
nginx 適配react-routerbrowserRoute 路由問題
絕對能用的一篇nginx配置,文末直接有文件,伸手黨直接拿走
本文環(huán)境比較復(fù)雜,首先兩層nginx轉(zhuǎn)發(fā),并且訪問路徑也不是根路徑。加上對nginx一知半解,各路搜索一看,全程懵逼。最終沒有一個能用的。最后還是靠同事幫助,文檔大法結(jié)束加班。本文知識點:location優(yōu)先級,nginx資源文件尋找方式,rewrite 重定向問題。
location 優(yōu)先級= 開頭表示精確匹配
^~ 開頭表示uri以某個常規(guī)字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規(guī)則^~ /static/ /aa匹配到(注意是空格)。以xx開頭
~ 開頭表示區(qū)分大小寫的正則匹配???????????????????? 以xx結(jié)尾
~* 開頭表示不區(qū)分大小寫的正則匹配??????????????? 以xx結(jié)尾
!~和!~*分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
try_file 使用當用戶請求 http://localhost/example 時,這里的 $uri 就是 /example。
try_files 會到硬盤里嘗試找這個文件。如果存在名為 /$root/example(其中 $root 是項目代碼安裝目錄)的文件,就直接把這個文件的內(nèi)容發(fā)送給用戶。
顯然,目錄中沒有叫 example 的文件。然后就看 $uri/,增加了一個 /,也就是看有沒有名為 /$root/example/ 的目錄。
又找不到,就會 fall back 到 try_files 的最后一個選項 /index.php,發(fā)起一個內(nèi)部 “子請求”,也就是相當于 nginx 發(fā)起一個 HTTP 請求到 http://localhost/index.php。
首先文件存放路徑是子目錄 /usr/local/services/app_logical_server-1.0/bin/app/screen
訪問路徑是 https://example.com/app/screen/
server { listen 8080; root /usr/local/services/app_logical_server-1.0/bin/app/screen; location ~* .(gif|jpg|png|js|css)$ { root /usr/local/services/app_logical_server-1.0/bin/app/screen/; } location ^~ /app/screen { root html; index index.html; try_files $uri $uri/ /index.html; } }錯誤點
錯誤現(xiàn)象是index.html可以找到,但是index.html中的js寫的是相對路徑,導(dǎo)致所有的靜態(tài)資源文件也進入了第二個location,導(dǎo)致頁面白屏。
分析如下。
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規(guī)則處理請求。
~* 的優(yōu)先級低于 ^~所以第一個配置靜態(tài)資源文件雖然寫在前面,還是不會進去的。
解決優(yōu)先級問題后,問題依然存在。原因就是這個。root 在server和location中都有,都是配置文件開始尋找的根路徑,如果url是https://xxxx:8084/app/screen,location中的配置優(yōu)先級高于server。首先會進入第二個location中,尋找文件,文件路徑是root和域名后面的路徑的拼接,例如:訪問路徑是 https://example.com/app/screen/umi.js,server root 為 /usr/local/services/app_logical_server-1.0/bin/app/screen。 nginx尋找文件的地址為/usr/local/services/app_logical_server-1.0/bin/app/screen/app/screen/umi.js.當然找不到,報404錯誤。
正確的配置server { listen 8084; root /usr/local/services/app_logical_server-1.0/bin/; location ~* .(gif|jpg|png|js|css)$ { root /usr/local/services/app_logical_server-1.0/bin; } location ~* /app/screen { #try_files $uri $uri/ /usr/local/services/app_logical_server-1.0/bin/app/screen/index.html; root /usr/local/services/app_logical_server-1.0/bin; try_files /app/screen/index.html =404; } }不帶/的url重定向問題
當前配置還有個問題,就是末尾不帶斜杠時,index.html可以加載到,但是html中的資源文件寫的相對路徑,當url 為https://example/app/screen時,相對路徑為https://example/app,以js為例,https://example/app/umi.js,所以報404錯誤。
解決方案為,利用location優(yōu)先級,再加一個 = /app/screen 的location 。
location = /sa/screen { rewrite ^([^.]*[^/])$ $1/ permanent; port_in_redirect off; }
但是到此還沒結(jié)束。因為業(yè)務(wù)需要,本層nginx前面還有一層Nginx。所以301 重定向的時候,會帶上端口號。導(dǎo)致找不到請求。port_in_redirect off; 配置可以解決此問題
最終版完美配置
server { listen 8084; root /usr/local/services/app_logical_server-1.0/bin/; location = /sa/screen { rewrite ^([^.]*[^/])$ $1/ permanent; port_in_redirect off; } location ~* .(gif|jpg|png|js|css)$ { root /usr/local/services/app_logical_server-1.0/bin; } location ~* /app/screen { #try_files $uri $uri/ /usr/local/services/app_logical_server-1.0/bin/app/screen/index.html; root /usr/local/services/app_logical_server-1.0/bin; try_files /app/screen/index.html =404; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/106915.html
摘要:詳見對綁定監(jiān)聽事件,把的改變同步到的中用來把的更新同步到中。代碼分割版本通過和實現(xiàn)代碼分割和動態(tài)路由。筆者認為,更符合的組件思想,于是做了一個實踐。 原文:https://github.com/YutHelloWo... 前言 今年3月初發(fā)布了react-router v4,相較之前的v3和v2版本做了一個破壞性的升級。遵循一切皆React Component的理念。靜態(tài)路由變成了動態(tài)...
摘要:中的包中的包主要有三個和。的理念上面提到的理念是一切皆組件以下統(tǒng)一稱組件。從這點來說的確方便了不少,也迎合一切皆組件的理念。組件是中主要的組成單位,可以認為是或的路由入口。將該標示為嚴格匹配路由。的屬性追加一條。 2019年不知不覺已經(jīng)過去19天了,有沒有給自己做個總結(jié)?有沒有給明年做個計劃?當然筆者已經(jīng)做好了明年的工作、學(xué)習(xí)計劃;同時也包括該系列博客剩下的博文計劃,目前還剩4篇:分別...
摘要:一般情況下,都是作為等其他子路由的上層路由,使用了,接收一個屬性,傳遞給消費子組件。創(chuàng)建對象,兼容老瀏覽器,其他和沒有大區(qū)別總結(jié)分為四個包,分別為,其中是瀏覽器相關(guān),是相關(guān),是核心也是共同部分,是一些配置相關(guān)。 這篇文章主要講的是分析 react-router 源碼,版本是 v5.x,以及 SPA 路由實現(xiàn)的原理。 文章首發(fā)地址 單頁面應(yīng)用都用到了路由 router,目前來看實現(xiàn)路由有...
摘要:使用了約等于才能匹配或者能匹配,所以說是約等于。使用了和才能匹配后續(xù)補充這是版本中新添加,主要用來做唯一匹配的功能。就是想要在眾多路由中只匹配其中一個路由。 React-Router v4 一. Switch 、Router 、Route三者的區(qū)別 1、Route Route 是建立location 和 ui的最直接聯(lián)系 2、Router react-router v4 中,Route...
摘要:概述這一章仔細講一講的使用栗子簡單使用源碼簡單使用首頁文章我的首頁文章我的效果帶導(dǎo)航激活效果源碼帶導(dǎo)航效果首頁文章我的首頁文章我的效果說明增強版,如果當前路由命中,將會啟用或者。 0x000 概述 這一章仔細講一講 react-route 的使用栗子 0x001 簡單使用 源碼 import React from react import ReactDom from react-d...
閱讀 2289·2021-11-24 09:38
閱讀 1985·2021-11-22 14:44
閱讀 1149·2021-07-29 13:48
閱讀 2614·2019-08-29 13:20
閱讀 1115·2019-08-29 11:08
閱讀 2046·2019-08-26 10:58
閱讀 1264·2019-08-26 10:55
閱讀 3148·2019-08-26 10:39