Nginx+Tomcat部署Angular+javaweb項(xiàng)目(解決刷新404)

最近項(xiàng)目進(jìn)入了即將驗(yàn)收階段,項(xiàng)目部署是必不可少的。由于某些原因,我們把前端項(xiàng)目(Angular4)和后端項(xiàng)目(JavaWeb),由于要部署了四個(gè)項(xiàng)目:Angular4(微信端),微信端數(shù)據(jù)服務(wù),JavaWeb(PC端)*2,并且是放在同一個(gè)服務(wù)器下。Java項(xiàng)目比較好部署,Tomcat/Jetty都可以輕松部署好。但是Angular部署起來不是那么的容易(當(dāng)然是對(duì)于我這種菜鳥而言),我先說下為什么我說不容易的原因。

最初時(shí),我用ng build –prod –aot編譯打包的時(shí)候。這里注意一下,由于現(xiàn)在官方已經(jīng)內(nèi)置了,所以打包的時(shí)候只需要輸入ng build –prod即可了。這里可以以我的項(xiàng)目體積相比較一下:

ng build : 8,348,761字節(jié)
ng build –aot : 9,232,405字節(jié)
ng build –prod : 1,839,811字節(jié)
ng build –prod –aot : 1,839,811字節(jié)

最后可以看出,ng build –prod即可完成產(chǎn)品化最小打包。這里我有一點(diǎn)不懂,預(yù)編譯構(gòu)建反而比常規(guī)構(gòu)建的體積還要大,希望大神可以幫忙解答。

這里就不再講如何讓項(xiàng)目更小了。

當(dāng)我把dist里面的文件拷到Tomcat的ROOT文件夾下,打開http://127.0.0.1的時(shí)候,熟悉的項(xiàng)目頁面展示了出來。習(xí)慣性按了F5刷新,發(fā)現(xiàn)出現(xiàn)了404錯(cuò)誤。在百度找了相關(guān)的問題,得出:在第一次進(jìn)入頁面時(shí),跑正常流程以及正常流程都是由Angular的路由機(jī)制進(jìn)行處理。然而如果有刷新操作,那么則是向后端服務(wù)發(fā)送的請(qǐng)求,如果后端沒有把你的請(qǐng)求重定向到index.html(此處是指單頁面應(yīng)用入口),那就會(huì)報(bào)404找不到頁面錯(cuò)誤。

哇,好啰嗦啊。不過至少明白了是什么原因,知道了什么原因那就應(yīng)該想該如何去解決吧!

  • 解決方法1:

    將Angular的url風(fēng)格配置成hash風(fēng)格,這個(gè)辦法是我見的最多的了,都是從StackOverflow上面抄來抄去的?,F(xiàn)在普遍都用H5的pushstate風(fēng)格了,并且angular官方告訴我們,如果沒有足夠使用hash風(fēng)格的理由,還是盡量使用H5風(fēng)格,您現(xiàn)在還來個(gè)#錨點(diǎn)不太合適吧?而且也有人指出如果配置了hash風(fēng)格,在微信支付或是angular的深路徑依然會(huì)出404的問題。如果你執(zhí)意要用,那也沒問題,詳細(xì)可見官方文檔

  • 解決方法2:

    既然它報(bào)404,你就在tomcat指定錯(cuò)誤頁為根目錄不就好了嗎?

    描述:打開Tomcat容器目錄,Tomcat/conf/web.xml,移到底部,在</web-app>上加上以下代碼:

    <error-page>
        <error-code>404</error-code>
        <location>/</location>
    </error-page>
    

配置完后,重啟Tomcat。這下再怎么刷新,頁面都展示沒問題了。但是我們發(fā)現(xiàn),雖然頁面能展示,但是在network標(biāo)簽下,我們是可以看到404的請(qǐng)求的。也就是說,我們刷新的那一刻,angular是找不到頁面的,只是被Tomcat當(dāng)作404指引到了index.html去了。Tomcat把一位誤入歧途的人引回了正路,只不過也同時(shí)在他身上印下了“他曾經(jīng)是壞人”的標(biāo)記。我們先不說配錯(cuò)誤頁的方法合不合適,先說有這個(gè)404的標(biāo)記會(huì)給我們帶來什么問題。首先,只要是遇到了有404錯(cuò)誤頁處理的平臺(tái),你肯定是完了。比如微信,他檢測到了你出現(xiàn)了404頁,他馬上給你一個(gè)幫丟失的孩子找到家的一個(gè)頁面。

很良心,很善良吧,他對(duì)公益是做好了,但你的工作要丟了啊。你的頁面要是放在公眾號(hào)里面,一授權(quán)就進(jìn)入了找小孩的頁面,你們經(jīng)理不砍死你就好了。所以這個(gè)辦法用不用,你自己看著辦吧!

  • 解決辦法3
    那你頁面找不到,我后端就指導(dǎo)你咯!我寫個(gè)攔截器,或者過濾器。你發(fā)送任何請(qǐng)求前,我先重定向到你index.html去,這總沒問題吧!當(dāng)然沒問題呀,這就是針對(duì)病因找特效藥啊這一切似乎完美解決但是,我們發(fā)現(xiàn),我們今天的主題都沒講到,肯定得挑這個(gè)解決辦法的一點(diǎn)問題啊!不然就顯得我們的終極大招平淡無奇了。

由于我們項(xiàng)目是前后分離,無狀態(tài)化服務(wù)。后端負(fù)責(zé)數(shù)據(jù)庫操作,把相關(guān)接口數(shù)據(jù)返回給前端,前端只負(fù)責(zé)處理顯示邏輯以及與后端進(jìn)行交互。頻繁轉(zhuǎn)發(fā),
后端ps:你都讓我不用處理頁面了,還讓我轉(zhuǎn)發(fā),是不是傻???如果你們后端就是不想做轉(zhuǎn)發(fā)的工作,你能怎么辦?當(dāng)然是欺負(fù)運(yùn)維??!

  • 解決辦法·終極
    如果是運(yùn)維大神,那估計(jì)你可以在旁邊喝茶就好了。如果是…萌新?那你作為前端,就可以幫(zhuang)忙(bi)了,用nginx?。》聪虼?,負(fù)載均衡,balabala…

    這里假裝你有nginx環(huán)境,我這里用到的是windows。打開nginx.conf文件,不寫具體描述了,自己看注釋,如果不想看的,可以直接去下載該配置文件。

    http {
    
    # 此處省略好多字
    
    server {
    
        # nginx才配使用80端口,其他服務(wù)速速離去
        listen       80;
    
        # 沒啥好解釋的
        server_name  localhost;
    
        # 指定根目錄,由于我的前端項(xiàng)目是直接放在nginx下的html文件夾,所以我這樣配
        root html;
    
        # 這里其實(shí)是由if變過來的,意思是如果uri存在,那就訪問uri的資源,如果uri不存在,那就訪問該目錄下index.html文件。如果看不懂我的解釋,可以看這個(gè)https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#front-controller-pattern-web-apps
        try_files $uri $uri/ /index.html;
    
        # 這里是配你Tomcat里面的其他java項(xiàng)目,意思是當(dāng)你訪問http://ip/xxx的時(shí)候,會(huì)到這個(gè)代碼塊里面進(jìn)行對(duì)應(yīng)操作
        location /xxx {
            # 這些照著加就好了,無非是獲取服務(wù)器host/ip相關(guān),一定要加,否則如果你的項(xiàng)目并不是前后端分離,而是SSH/SSM帶有jsp或者模板頁面的,那就會(huì)出現(xiàn)找不到css/js等找不到一切靜態(tài)資源文件的錯(cuò)誤。為什么會(huì)報(bào)錯(cuò),因?yàn)槟憧磏etwork面板你就知道,他是去訪問http://127.0.0.1/xxx/css...而并不是訪問服務(wù)器的真實(shí)ip,所以還是乖乖加上吧!
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 去該地址去找項(xiàng)目資源
            proxy_pass http://127.0.0.1:8080/xxx;
        }
      }
    }
    

    好了,就這么多,行不行你自己看著辦吧!
    歡迎大神指導(dǎo)改正!蟹蟹~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,663評(píng)論 19 139
  • Page 1:nginx 服務(wù)器安裝及配置文件詳解 CentOS 6.2 x86_64 安裝 nginx 1.1 ...
    xiaojianxu閱讀 8,689評(píng)論 1 41
  • nginx做負(fù)載均衡器以及proxy緩存配置 關(guān)于nginx的安裝和基本配置請(qǐng)參考nginx,本文在原基礎(chǔ)上完成以...
    meng_philip123閱讀 1,789評(píng)論 1 16
  • nginx在工作中已經(jīng)有好幾個(gè)環(huán)境在使用了,每次都是重新去網(wǎng)上扒博客,各種編譯配置,今天自己也整理一份安裝文檔和n...
    AndyChin閱讀 2,401評(píng)論 0 4
  • 尊敬的各位領(lǐng)導(dǎo),老師,親愛的同學(xué)們,大家下午好!自10月13日學(xué)工部下發(fā)通知以來,在學(xué)校領(lǐng)導(dǎo)的大力支持下,經(jīng)過各班...
    燕子不飛么閱讀 350評(píng)論 0 0

友情鏈接更多精彩內(nèi)容