Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 中文字幕一区二区在线视频,免费一区二区三区毛片10分钟,蜜芽一区二区国产精品

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          vue項(xiàng)目本地開發(fā)完成后部署到服務(wù)器后報(bào)404是什么

          vue項(xiàng)目本地開發(fā)完成后部署到服務(wù)器后報(bào)404是什么原因呢?

          ue路由配置:

          const router=new VueRouter({
            base: process.env.BASE_URL,
            //hash模式下部署到服務(wù)器訪問(wèn)沒問(wèn)題,history就不行,需要在服務(wù)器上配置
            mode: 'history',
            routes
          })

          vue.config.js配置:

          module.exports={
            lintOnSave: false,
            publicPath: process.env.VUE_APP_PATH,
            // publicPath : process.env.NODE_ENV==='production' ? './' : '/',
            outputDir: 'dist',
            devServer: {
              disableHostCheck: true,
              // overlay: { // 讓瀏覽器 overlay 同時(shí)顯示警告和錯(cuò)誤
              //   warnings: true,
              //   errors: true
              // },
              https: false, // https:{type:Boolean}
              open: false, //配置后自動(dòng)啟動(dòng)瀏覽器
              hotOnly: true, // 熱更新
              proxy: { //配置多個(gè)代理
                "/api": {
                  target: "http://192.168.2.241",
                  changeOrigin: true,
                  ws: true, //websocket支持
                  secure: false,
                },
              }
            },
          }

          404報(bào)錯(cuò)原因:

          當(dāng)我們?cè)O(shè)置了mode為history時(shí),當(dāng)前端發(fā)送路徑給服務(wù)端時(shí),服務(wù)端根本就不認(rèn)識(shí)省去#的url,所以返回給我們404,因?yàn)関ue是單一頁(yè)面所有的頁(yè)面都在index.html中,vue是用js來(lái)切換頁(yè)面的,具體的解釋看vue官網(wǎng)

          解決辦法:

          nginx服務(wù)器修改

          location / {
            if (!-e $request_filename) {
              rewrite  ^(.*)$ /index.html?s=/$1  last;
              break;
            }
          }

          一、如何部署

          前后端分離開發(fā)模式下,前后端是獨(dú)立部署的,前端只需要將最后的構(gòu)建物上傳至目標(biāo)服務(wù)器的web容器指定的靜態(tài)目錄下即可

          我們知道vue項(xiàng)目在構(gòu)建后,是生成一系列的靜態(tài)文件

          常規(guī)部署我們只需要將這個(gè)目錄上傳至目標(biāo)服務(wù)器即可

          // scp 上傳 user為主機(jī)登錄用戶,host為主機(jī)外網(wǎng)ip, xx為web容器靜態(tài)資源路徑
          scp dist.zip user@host:/xx/xx/xx
          

          web容器跑起來(lái),以nginx為例

          server {
            listen  80;
            server_name  www.xxx.com;
          
            location / {
              index  /data/dist/index.html;
            }
          }
          

          配置完成記得重啟nginx

          // 檢查配置是否正確
          nginx -t 
          
          // 平滑重啟
          nginx -s reload
          


          操作完后就可以在瀏覽器輸入域名進(jìn)行訪問(wèn)了

          當(dāng)然上面只是提到最簡(jiǎn)單也是最直接的一種布署方式

          什么自動(dòng)化,鏡像,容器,流水線布署,本質(zhì)也是將這套邏輯抽象,隔離,用程序來(lái)代替重復(fù)性的勞動(dòng),本文不展開

          二、404問(wèn)題

          這是一個(gè)經(jīng)典的問(wèn)題,相信很多同學(xué)都有遇到過(guò),那么你知道其真正的原因嗎?

          我們先還原一下場(chǎng)景:

          • vue項(xiàng)目在本地時(shí)運(yùn)行正常,但部署到服務(wù)器中,刷新頁(yè)面,出現(xiàn)了404錯(cuò)誤

          先定位一下,HTTP 404 錯(cuò)誤意味著鏈接指向的資源不存在

          問(wèn)題在于為什么不存在?且為什么只有history模式下會(huì)出現(xiàn)這個(gè)問(wèn)題?

          為什么history模式下有問(wèn)題

          Vue是屬于單頁(yè)應(yīng)用(single-page application)

          SPA是一種網(wǎng)絡(luò)應(yīng)用程序或網(wǎng)站的模型,所有用戶交互是通過(guò)動(dòng)態(tài)重寫當(dāng)前頁(yè)面,前面我們也看到了,不管我們應(yīng)用有多少頁(yè)面,構(gòu)建物都只會(huì)產(chǎn)出一個(gè)index.html

          現(xiàn)在,我們回頭來(lái)看一下我們的nginx配置

          server {
            listen  80;
            server_name  www.xxx.com;
          
            location / {
              index  /data/dist/index.html;
            }
          }
          


          可以根據(jù) nginx 配置得出,當(dāng)我們?cè)诘刂窓谳斎?www.xxx.com 時(shí),這時(shí)會(huì)打開我們 dist 目錄下的 index.html 文件,然后我們?cè)偬D(zhuǎn)路由進(jìn)入到 www.xxx.com/login

          關(guān)鍵在這里,當(dāng)我們?cè)?website.com/login 頁(yè)執(zhí)行刷新操作,nginx location 是沒有相關(guān)配置的,所以就會(huì)出現(xiàn) 404 的情況

          為什么hash模式下沒有問(wèn)題

          router hash 模式我們都知道是用符號(hào)#表示的,如 website.com/#/login, hash 的值為 #/login

          它的特點(diǎn)在于:hash 雖然出現(xiàn)在 URL 中,但不會(huì)被包括在內(nèi) HTTP 請(qǐng)求中,對(duì)服務(wù)端完全沒有影響,因此改變 hash 不會(huì)重新加載頁(yè)面

          hash 模式下,僅 hash 符號(hào)之前的內(nèi)容會(huì)被包含在請(qǐng)求中,如 website.com/#/login 只有 website.com 會(huì)被包含在請(qǐng)求中 ,因此對(duì)于服務(wù)端來(lái)說(shuō),即使沒有配置location,也不會(huì)返回404錯(cuò)誤

          那么vue-router的hash模式和histroy模式有什么區(qū)別呢?

          1、hash模式url帶#,histroy模式url不帶#

          2、hash模式解決了通過(guò)http請(qǐng)求來(lái)切換頁(yè)面,改變路徑可以直接改變頁(yè)面,無(wú)需進(jìn)行網(wǎng)絡(luò)請(qǐng)求,這叫前端路由,在hash模式下改變的是#中的信息,

          history模式,可以前進(jìn)和后退,但是不能刷新頁(yè)面,刷新之后就會(huì)報(bào)錯(cuò)。如果后端沒有對(duì)路由地址進(jìn)行相應(yīng)的處理,那么就會(huì)報(bào)404的錯(cuò)。

          3、hash瀏覽器支持率比較好,支持低版本的瀏覽器,但history的方法只支持部分瀏覽器。


          解決方案

          看到這里我相信大部分同學(xué)都能想到怎么解決問(wèn)題了,

          產(chǎn)生問(wèn)題的本質(zhì)是因?yàn)槲覀兊穆酚墒峭ㄟ^(guò)JS來(lái)執(zhí)行視圖切換的,

          當(dāng)我們進(jìn)入到子路由時(shí)刷新頁(yè)面,web容器沒有相對(duì)應(yīng)的頁(yè)面此時(shí)會(huì)出現(xiàn)404

          所以我們只需要配置將任意頁(yè)面都重定向到 index.html,把路由交由前端處理

          對(duì)nginx配置文件.conf修改,添加try_files $uri $uri/ /index.html;

          server {
            listen  80;
            server_name  www.xxx.com;
          
            location / {
              index  /data/dist/index.html;
              try_files $uri $uri/ /index.html;
            }
          }
          


          修改完配置文件后記得配置的更新

          nginx -s reload
          

          這么做以后,你的服務(wù)器就不再返回 404 錯(cuò)誤頁(yè)面,因?yàn)閷?duì)于所有路徑都會(huì)返回 index.html 文件

          為了避免這種情況,你應(yīng)該在 Vue 應(yīng)用里面覆蓋所有的路由情況,然后再給出一個(gè) 404 頁(yè)面

          const router=new VueRouter({
            mode: 'history',
            routes: [
              { path: '*', component: NotFoundComponent }
            ]
          })
          


          關(guān)于后端配置方案還有:Apachenodejs等,思想是一致的,這里就不展開述說(shuō)了

          給大家分享我收集整理的各種學(xué)習(xí)資料,前端小白交流、學(xué)習(xí)交流,也可以直接問(wèn)我,我會(huì)組織大家一起做項(xiàng)目練習(xí),幫助大家匹配一位學(xué)習(xí)伙伴互相監(jiān)督學(xué)習(xí)-下面是學(xué)習(xí)資料參考。

          前端學(xué)習(xí)交流、自學(xué)、學(xué)習(xí)資料、新手入門教程,自學(xué)教程等推薦

          戶反映:說(shuō)自己的網(wǎng)站走nginx代理后,打開空白。直接IP加地址訪問(wèn)是好的(http://ip:port)

          故障排查

          1、打開chrome瀏覽器,訪問(wèn)了下,訪問(wèn)情況真是客戶描述的那樣。

          2、感覺打開chrome ,開發(fā)者工具,發(fā)現(xiàn)部分請(qǐng)求URL是404,css和js的



          3、找客戶要服務(wù)器登錄的賬號(hào),檢查nginx配置文件

          upstream www.test.com{
           server 127.0.0.1:8080;
          }
          server {
           listen 80;
           listen 443 ssl http2;
           ssl_certificate /usr/local/nginx/conf/ssl/www.test.com.pem;
           ssl_certificate_key /usr/local/nginx/conf/ssl/www.test.com.key;
           server_name www.test.com;
           access_log /data/wwwlogs/www.test.com_nginx.log combined;
           index index.html index.htm index.jsp;
           root /data/wwwroot/www.test.com;
           
           
           location ~ .*\.(js|css)?$ {
           
           expires 7d;
           access_log off;
           }
          ?
           location / {
           proxy_pass http://www.test.com;
           include proxy.conf;
           }
          }
          

          4、大家有發(fā)現(xiàn)上面配置有問(wèn)題不?剛開始我也沒有注意,自認(rèn)為配置文件是對(duì) 的。

          打算檢查nginx的日志,一遍請(qǐng)求URL,一遍查看nginx果然還是404.(感覺疑惑),明明配置了proxy_pass http://www.test.com。

          故障原因:

          是因?yàn)?“l(fā)ocation ~ .*\.(js|css)?$” 這個(gè)匹配攔截掉了,請(qǐng)求不能正常發(fā)往下一個(gè)“l(fā)ocation /” ,也就不能正常抵達(dá)后端proxy_pass了。

          解決方法:

          第一種解決方法:是將后端的靜態(tài)文件(css 和js ),放入前置nginx 機(jī)器/data/wwwroot/www.test.com

          第二種解決方法 :修改配置文件

          upstream www.test.com{
           server 127.0.0.1:8080;
          }
          server {
           listen 80;
           listen 443 ssl http2;
           ssl_certificate /usr/local/nginx/conf/ssl/www.test.com.pem;
           ssl_certificate_key /usr/local/nginx/conf/ssl/www.test.com.key;
           server_name www.test.com;
           access_log /data/wwwlogs/www.test.com_nginx.log combined;
           index index.html index.htm index.jsp;
           root /data/wwwroot/www.test.com;
           
          ?
           location ~ .*\.(js|css)?$ {
           proxy_pass http://www.test.com;
           expires 7d;
           access_log off;
           }
          ?
           location / {
           proxy_pass http://www.test.com;
           include proxy.conf;
           }
          }
          

          ?

          ??此賬號(hào)為華為云開發(fā)者社區(qū)官方運(yùn)營(yíng)賬號(hào),提供全面深入的云計(jì)算前景分析、豐富的技術(shù)干貨、程序樣例,分享華為云前沿資訊動(dòng)態(tài)


          本文分享自華為云社區(qū)《學(xué)習(xí)VueRouter,HTML5 History 模式,因?yàn)閔istory模式刷新頁(yè)面會(huì)出現(xiàn)404》,作者: DevFeng 。


          vue-router 默認(rèn) hash 模式 —— 使用 URL 的 hash 來(lái)模擬一個(gè)完整的 URL,于是當(dāng) URL 改變時(shí),頁(yè)面不會(huì)重新加載。

          如果不想要很丑的 hash,我們可以用路由的 history 模式,這種模式充分利用 history.pushState API 來(lái)完成 URL 跳轉(zhuǎn)而無(wú)須重新加載頁(yè)面。

          const router=new VueRouter({
            mode: 'history',
            routes: [...]
          })

          當(dāng)你使用 history 模式時(shí),URL 就像正常的 url,例如 http://yoursite.com/user/id,也好看!

          不過(guò)這種模式要玩好,還需要后臺(tái)配置支持。因?yàn)槲覀兊膽?yīng)用是個(gè)單頁(yè)客戶端應(yīng)用,如果后臺(tái)沒有正確的配置,當(dāng)用戶在瀏覽器直接訪問(wèn) http://oursite.com/user/id 就會(huì)返回 404,這就不好看了。

          所以呢,你要在服務(wù)端增加一個(gè)覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源,則應(yīng)該返回同一個(gè) index.html 頁(yè)面,這個(gè)頁(yè)面就是你 app 依賴的頁(yè)面。

          #后端配置例子

          注意:下列示例假設(shè)你在根目錄服務(wù)這個(gè)應(yīng)用。如果想部署到一個(gè)子目錄,你需要使用 VueCLI 的

          publicPath 選項(xiàng) (opens new window)和相關(guān)的 router base property (opens new window)。你還需要把下列示例中的根目錄調(diào)整成為子目錄 (例如用 RewriteBase /name-of-your-subfolder/ 替換掉 RewriteBase/)。

          #Apache

          <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteRule ^index\.html$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule . /index.html [L]
          </IfModule>

          除了 mod_rewrite,你也可以使用 FallbackResource (opens new window)。

          #nginx

          location / {
            try_files $uri $uri/ /index.html;
          }

          #原生 Node.js

          const http=require('http')
          const fs=require('fs')
          const httpPort=80
          
          http.createServer((req, res)=> {
            fs.readFile('index.html', 'utf-8', (err, content)=> {
              if (err) {
                console.log('We cannot open "index.html" file.')
              }
          
              res.writeHead(200, {
                'Content-Type': 'text/html; charset=utf-8'
              })
          
              res.end(content)
            })
          }).listen(httpPort, ()=> {
            console.log('Server listening on: http://localhost:%s', httpPort)
          })

          #基于 Node.js 的 Express

          對(duì)于Node.js/Express,請(qǐng)考慮使用 connect-history-api-fallback 中間件 (opens new window)。

          #Internet InformationServices (IIS)

          1. 安裝 IIS UrlRewrite(opens new window)

          2. 在你的網(wǎng)站根目錄中創(chuàng)建一個(gè) web.config 文件,內(nèi)容如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <configuration>
            <system.webServer>
              <rewrite>
                <rules>
                  <rule name="Handle History Mode and custom 404/500" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAll">
                      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/" />
                  </rule>
                </rules>
              </rewrite>
            </system.webServer>
          </configuration>

          #Caddy

          rewrite {
              regexp .*
              to {path} /
          }

          #Firebase 主機(jī)

          在你的 firebase.json 中加入:

          {
            "hosting": {
              "public": "dist",
              "rewrites": [
                {
                  "source": "**",
                  "destination": "/index.html"
                }
              ]
            }
          }

          #警告

          給個(gè)警告,因?yàn)檫@么做以后,你的服務(wù)器就不再返回 404 錯(cuò)誤頁(yè)面,因?yàn)閷?duì)于所有路徑都會(huì)返回

          index.html 文件。為了避免這種情況,你應(yīng)該在 Vue 應(yīng)用里面覆蓋所有的路由情況,然后再給出一個(gè) 404 頁(yè)面。

          const router=new VueRouter({
            mode: 'history',
            routes: [
              { path: '*', component: NotFoundComponent }
            ]
          })

          或者,如果你使用 Node.js 服務(wù)器,你可以用服務(wù)端路由匹配到來(lái)的 URL,并在沒有匹配到路由的時(shí)候返回 404,以實(shí)現(xiàn)回退。


          點(diǎn)擊關(guān)注,第一時(shí)間了解華為云新鮮技術(shù)~華為云博客_大數(shù)據(jù)博客_AI博客_云計(jì)算博客_開發(fā)者中心-華為云


          主站蜘蛛池模板: 78成人精品电影在线播放日韩精品电影一区亚洲 | 精品国产高清自在线一区二区三区| 亚洲视频一区二区三区| 久久精品一区二区三区中文字幕| 亚洲精品精华液一区二区| 精品一区二区ww| 亚洲一区二区三区电影| 大香伊蕉日本一区二区| 日韩精品一区二区三区大桥未久| 北岛玲在线一区二区| 国产成人久久一区二区三区 | 成人中文字幕一区二区三区| 中文字幕一区精品| 波多野结衣电影区一区二区三区 | 精品一区二区三区免费视频 | 交换国产精品视频一区| 国产一区二区在线视频| 色老板在线视频一区二区| 成人区精品一区二区不卡 | 久久亚洲一区二区| 久久人妻无码一区二区| 99无码人妻一区二区三区免费| 午夜福利一区二区三区高清视频| 国产精品一区二区久久国产| 亚洲中文字幕无码一区二区三区| 国偷自产Av一区二区三区吞精| 精品一区二区三区高清免费观看| 国产成人精品一区二区三区| 日产一区日产2区| 久久精品一区二区三区资源网 | 久久伊人精品一区二区三区| 精品日韩亚洲AV无码一区二区三区 | 久久久老熟女一区二区三区| 亚洲福利秒拍一区二区| 中文字幕精品一区二区2021年| 好吊妞视频一区二区| 国产乱码精品一区三上| 国产美女精品一区二区三区| 亚洲福利一区二区| 国产av一区二区精品久久凹凸| 亚洲性日韩精品一区二区三区|