nginx+apache+單頁面刷新404問題解決方案

0. 背景

一個實際的應用環(huán)境中需要同時部署多個站點,所以選擇同時使用nginx和apache衙解,使用apache web容器同時部署2個站點鲤妥,使用nginx進行轉發(fā)。但由于網(wǎng)站是使用react或vue開發(fā)的苍姜,一個使用了hash router,一個使用的是history router悬包,中途遇到一個問題是當使用的是history路由時,如果當前而在不是index頁面馍乙,瀏覽器刷新后會出現(xiàn)404錯誤

1. 應用運行環(huán)境

操作系統(tǒng):CentOS Linux release 7.6.1810 (Core)

Web容器:Apache/2.4.6 (CentOS)

nginx:nginx/1.16.0

2. Apache多站點部署快捷方法

方法一:同域名下多個站點

本質上仍是一個網(wǎng)站布近,通過二級目錄的方式劃分成2個不同的站點

方法二:不同域名多個站點

本質是是通過Apache的VirtualHost實現(xiàn)垫释,具體配置詳細說明如下:

由于在我的應用環(huán)境中向外是通過nginx做轉發(fā),所以這里說明通過VirtualHost基本端口號實現(xiàn)多站點的配置過程

  • 在/etc/httpd/conf/httpd.conf中增加以下內容

    Listen 8080
    Listen 8090
    #以上將在VirtualHost配置中使用
    LoadModule rewrite_module modules/mod_rewrite.so
    #上一行配置的作用在后續(xù)解決刷新404問題中的一步
    
  • 在/etc/httpd/conf.d/下新建host.conf文件撑瞧,文件在配置以下內容

    <VirtualHost localhost:8080>
            ServerAdmin root@localhost
            ServerName localhost:8091
            DocumentRoot "網(wǎng)站A根目錄"
            DirectoryIndex index.html
            <Directory "網(wǎng)站A根目錄">
                    Options Indexes Includes FollowSymlinks
                    AllowOverride All
                    Require all granted
            </Directory>
            ErrorLog /var/log/httpd/err_8080.log
            LogLevel warn
            CustomLog /var/log/httpd/err_8080_access.log combined
    </VirtualHost>
    <VirtualHost localhost:8090>
            ServerAdmin root@localhost
            ServerName localhost:8090
            DocumentRoot "網(wǎng)站B根目錄"
            DirectoryIndex index.html
            <Directory "網(wǎng)站B根目錄">
                    Options Indexes Includes FollowSymlinks
                    AllowOverride All
                    Require all granted
            </Directory>
            ErrorLog /var/log/httpd/err_8090.log
            LogLevel warn
            CustomLog /var/log/httpd/err_8090_access.log combined
    </VirtualHost>
    

3. nginx轉發(fā)配置

這里假設A網(wǎng)站分配域名為a.me.com棵譬,B網(wǎng)站分配域名是b.me.com

詳細配置如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    underscores_in_headers on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
   #將http請求轉發(fā)到https
   server {
        listen 80;
        server_name a.me.com;
        return 301 https://$server_name$request_uri;
   }

   server {
        listen 80;
        server_name b.me.com;
        return 301 https://$server_name$request_uri;
   }
    # HTTPS server
    #
    server {
        listen 443 ssl;
        server_name a.me.com;
        root html;
        index index.html index.htm;
        ssl_certificate   對應域名ssl證書路徑;
        ssl_certificate_key  對應域名ssl證書key路徑;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location ~* / {
            client_max_body_size  100M;
            proxy_pass http://localhost:8080;
            add_header Cache-Control 'max-age=0';
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
        location / {
            root html;
            index index.html index.htm;
        }
    }


    server {
        listen 443 ssl;
        server_name b.me.com;
        root html;
        index index.html index.htm;
        ssl_certificate   對應域名ssl證書路徑;
        ssl_certificate_key  對應域名ssl證書key路徑;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location ^~ /h5/ {
            proxy_pass http://localhost:8090;
            add_header Cache-Control 'max-age=0';
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location ~* / {
            client_max_body_size  100M;
            proxy_pass http://localhost:8090;
            add_header Cache-Control 'max-age=0';
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location / {
            client_max_body_size  100M;
            root html;
            index index.html index.htm;
        }
    }
}

4.怎么解決問題

在上述配置下使用React或Vue基本history的單頁面路由,當當前頁面不是index頁面時刷新時出現(xiàn)404問題

  • 定位產(chǎn)生問題原因

    由于同時使用了nginx和apache预伺,如果不確定問題是出在誰身上只能一點點的去試订咸,顯然是沒辦法的辦法。其實從本質上分析nginx是做轉發(fā)工作酬诀,那只要確定問題是不是出在轉發(fā)層面就可以了脏嚷。方法很直接:

    由于服務并沒有向外開放8080和8090端口,所以可以直接在服務上通過wget打開一個非index的具體頁面瞒御,如果可以打開那么問題自然是在nginx上父叙,否則是apache配置的問題。

    經(jīng)排除發(fā)現(xiàn)問題是在apache端

  • 問題解決辦法

    第一步肴裙、在apache配置文件中增加以下配置

    LoadModule rewrite_module modules/mod_rewrite.so
    

    第二步趾唱、在網(wǎng)站根目錄下新建.htaccess,文件內容如下

    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.html$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.html [L]
    </IfModule>
    
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蜻懦,一起剝皮案震驚了整個濱河市甜癞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宛乃,老刑警劉巖悠咱,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烤惊,居然都是意外死亡乔煞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門柒室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渡贾,“玉大人,你說我怎么就攤上這事雄右】丈В” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵擂仍,是天一觀的道長囤屹。 經(jīng)常有香客問我,道長逢渔,這世上最難降的妖魔是什么肋坚? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上智厌,老公的妹妹穿的比我還像新娘诲泌。我一直安慰自己,他們只是感情好铣鹏,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布敷扫。 她就那樣靜靜地躺著,像睡著了一般诚卸。 火紅的嫁衣襯著肌膚如雪葵第。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天合溺,我揣著相機與錄音卒密,去河邊找鬼。 笑死辫愉,一個胖子當著我的面吹牛栅受,可吹牛的內容都是我干的。 我是一名探鬼主播恭朗,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼屏镊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痰腮?” 一聲冷哼從身側響起而芥,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膀值,沒想到半個月后棍丐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡沧踏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年歌逢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘狱。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡秘案,死狀恐怖,靈堂內的尸體忽然破棺而出潦匈,到底是詐尸還是另有隱情阱高,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布茬缩,位于F島的核電站赤惊,受9級特大地震影響,放射性物質發(fā)生泄漏凰锡。R本人自食惡果不足惜未舟,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一圈暗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧处面,春花似錦厂置、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽智绸。三九已至野揪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞧栗,已是汗流浹背斯稳。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迹恐,地道東北人挣惰。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像殴边,于是被迫代替她去往敵國和親憎茂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 大多數(shù) Nginx 新手都會頻繁遇到這樣一個困惑锤岸,那就是當同一個location配置塊使用了多個 Nginx 模塊...
    SkTj閱讀 7,582評論 0 12
  • 一竖幔、概述 二、編譯安裝 三是偷、httpd服務基礎 四拳氢、httpd.conf配置文件 五、httpd服務訪問控制 六蛋铆、...
    紫_軒閱讀 944評論 0 0
  • nginx重寫規(guī)則 nginx rewrite 正則表達式匹配 大小寫匹配 ~ 為區(qū)分大小寫匹配 ~* 為不區(qū)分大...
    桖辶殤閱讀 5,529評論 0 2
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務都無法達到并發(fā)響應量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 1,988評論 0 9
  • AMP安裝 源碼包相關 源碼包安裝步驟:第一步(configure):我們需要檢測環(huán)境馋评;配置程序的安裝內容;生成m...
    寵辱不驚丶歲月靜好閱讀 781評論 0 1