Puncte:0

Serverul Nginx React va căuta numai active statice la rădăcină

drapel cn

Aplicația mea react funcționează dacă nginx reverse-proxy este setat după cum urmează:

Server {
    asculta 80;
    server_name my_public_vps_addr; 

    Locație / {
        proxy_pass http://127.0.0.1:3000/;
    }
}

Pot încărca pagina corect la http://my_public_vps_addr/.

Dar vreau să accesez site-ul prin http://my_public_vps_addr/ecapp/.

Deci am configurat nginx:

Server {
    asculta 80;
    server_name my_public_vps_addr; 

    locație /ecapp/ {
        proxy_pass http://127.0.0.1:3000/;
    }
}

Acum, dacă încarc pagina la http://my_public_vps_addr/ecapp/ și inspectez consola, primesc:

GET http://my_public_vps_addr/static/js/bundle.js
[HTTP/1.1 404 Nu a fost găsit 147 ms]
GET http://my_public_vps_addr/static/js/0.chunk.js
[HTTP/1.1 404 Nu a fost găsit 433ms]
GET http://my_public_vps_addr/static/js/main.chunk.js
[HTTP/1.1 404 Nu a fost găsit 424ms]

Am identificat o posibilă cauză. Activele ar trebui preluate de la http://my_public_vps_addr/ecapp/static/js/bundle.js etc în loc de http://my_public_vps_addr/static/js/bundle.js.

Pentru a remedia această eroare, voi enumera codul sursă relevant:

server.js

const express = require('express');
const compresie = require('compresie');
const cale = require('cale');
const app = expres();

app.use(compresie());
app.use(express.static(path.join(__dirname, 'build')));

app.get('*', function(req, res) {
    res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
    console.log(`Aplicația rulează pe portul ${PORT}`);
});

Am încercat app.use('/ecapp/static', express.static(path.join(__dirname, 'build'))); dar fara noroc.

Routes.js

const Rute = () => {
    întoarcere (
        <BrowserRouter>
            <Comutator>
                <Route path="/" exact component={Home} />
                ...
            </Switch>
        </BrowserRouter>
    );
};

Am încercat <BrowserRouter basename='/ecapp'></BrowserRouter> dar fara noroc.

Cred că aplicația se va încărca corect la http://my_public_vps_addr/ecapp/ dacă pot configura pagina pentru a căuta active la http://my_public_vps_addr/ecapp/static/*. Am nevoie de ajutor pentru a face asta.

Ivan Shatsky avatar
drapel gr
Aceasta este o întrebare mai mult SO decât SF. Nu sunt un expert React, dar vă pot sugera să verificați [Cum se implementează o aplicație React într-un subdirector](https://medium.com/@svinkle/how-to-deploy-a-react-app-to- a-subdirectory-f694d46427c1), îi ajută pe unii oameni cu întrebări similare despre SO să facă ceea ce cereți.
rafawhs avatar
drapel cn
Dacă nginx-ul dvs. are o configurație complexă pentru regulile de locație/cache, activați jurnalul de depanare docs.nginx.com/nginx/admin-guide/monitoring/logging și vedeți ce regulă sunt aplicate.Am avut aceeași problemă și a fost un conflict între setările de expirare js și html.
Puncte:1
drapel cn

Mi-am dat seama așa că postez soluția mea aici.

OBIECTIV

Pentru a găzdui site-ul create-react-app la http://my_public_vps_addr:port/sub_path.

PROCEDURĂ

  1. în fișierul .env: a) setați NODE_ENV=producție b) setați PUBLIC_URL la http://my_public_vps_addr:port/sub_path
  2. setează numele de bază: <Router basename=’/sub_path’></Router>
  3. npm run build a) aceasta generează fișiere statice în directorul build/.
  4. Copiați conținutul build/* în /var/www/sub_path/html/sub_path/
  5. cd la /var/www/sub_path/html/ A) sudo find . -type d -exec chmod 755 {} \; b) sudo find . -type f -exec chmod 644 {} \;
  6. atingeți /etc/nginx/sites-available/sub_path a) ln -s /etc/nginx/sites-available/sub_path /etc/nginx/sites-enabled/sub_path
  7. Conținutul /etc/nginx/sites-available/sub_path
    Server {
      portul de ascultare;
      asculta [::]:port;
      rădăcină /var/www/sub_path/html;
      index index.html index.htm index.nginx-debian.html;
      server_name my_public_vps_addr:port;
      locație /sub_path {
        try_files $uri $uri/ /index.html =404
      }
    }
  1. Reporniți serviciul nginx: a) sudo systemctl restart nginx.service
  2. Site-ul dvs. ar trebui să fie disponibil de la http://my_public_vps_addr:port/sub_path
  3. Asta e!
Ivan Shatsky avatar
drapel gr
Deși, în general, aceasta este abordarea corectă, mai ales în comparație cu cea care utilizează `sub_filter`, directiva dvs. `try_files` nu este corectă. Cel corect este `try_files $uri $uri/ /sub_path/index.html` (sau poate chiar `try_files $uri /sub_path/index.html`).
Puncte:0
drapel cn

m-am schimbat in:

locație /ecapp/ {
        sub_filter '<script src="/static' '<script src="/ecapp/static';
        sub_filtru_o dată dezactivat;
        proxy_set_header Acceptare-Codificare „”;
        proxy_pass http://127.0.0.1:3000;
}

Si acum view-source:http://my_public_vps_ip_addr/ecapp/ este:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="shortcut icon" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <link rel="manifest" href="/manifest.json" />
    <link
      rel="stylesheet"
      href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
      integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
      crossorigin="anonymous"
    />
    <title>React App</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  <script src="/ecapp/static/js/bundle.js"></script><script src="/ecapp/static/js/0.chunk.js"></script><script src="/ecapp/static/js/main.chunk.js"></script></body>
</html>

Dar acum încărcarea http://my_public_vps_ip_addr/ecapp/ oferă:

Scriptul de la âhttp://my_public_vps_addr/ecapp/static/js/bundle.jsâ a fost încărcat chiar dacă tipul său MIME (âtext/htmlâ) nu este un tip MIME JavaScript valid.
...
Eroare de sintaxă neprinsă: expresia așteptată, a primit „<”

http://my_public_vps_addr/ecapp/static/js/bundle.js etc nu returnează conținut.

drapel us
Aceasta este o abordare care dă bătăi de cap doar în viitor. Trebuie să configurați aplicația React în mod corespunzător, așa cum este indicat în comentariile de mai sus.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.