nginx 配置解決 ---react 、vue 單頁面路由之後重新整理404---問題
nginx中文文件:http://www.nginx.cn/doc/
nginx官網:http://nginx.org/en/docs/
Nginx開發從入門到精通:http://tengine.taobao.org/book/index.html
1、問題現象?
答:在瀏覽器中直接訪問www.xxx.com會正常顯示頁面,先訪問www.xxx.com後再點“demo" 跳轉到www.lyy.com/demo是正常顯示demo頁面的。這時在此頁面f5”重新整理“就會出現 404了。
2、分析出現404現象的原因?
答:這是web單頁面開發模式造成的。現在主流的前端框架基本都是單頁面的。如:react、vue等。
單頁面簡單來說就是訪問所有資源路徑、其實頁面內容只有一個(一般是index.html)。這個頁面中引入的js框架會根據當前訪問的url去路由到相應的子頁面元件(可以理解為頁面片段)進行邏輯處理和頁面渲染。
然而當你訪問www.xxx.com/demo其實web站中並沒demo這個頁面的資源(demo只是給js框架路由用的)。所以就報404啦!
3、怎麼解決這個問題,才能不讓他404,又能讓js框架正確路由呢?
答:分析出產生問題的原因就很好解決這個問題了。
解決:滿足以下兩點就行:
1.重新整理時要保證url路徑不變。即不能用重定向去訪問index.html,因為url會變。變了js框架就沒法路由,因為不知道你上次是哪個url了。
2.伺服器響應的內容一定要是index.html,因為index.html這裡載入了js框架和初始化一些東西。
具體做法:用nginx配置,不改變url的情況下響應index.html資源的內容。
location /demo { rewrite /index.html break; root 根路徑; } location /static { alias 根路徑/static; index index.html; }
這裡有個很重要的點:break
break 並不是重定向說告訴瀏覽器你重新去訪問index.html。而是說內部去找 /index.html頁面。去root對應的目錄下找。找到就返回頁面內容。這樣就保證了在url不變的情況下固定返回index.html內容。如果在root對應的目錄中沒找到index.html就會404了。和break 同級的命令lest,才是讓瀏覽器重定向的,即是重新發出請求。