React-yönlendirici ve nginx


109

React uygulamamı webpack-dev-server'dan nginx'e geçiriyorum.

"Localhost: 8080 / login" kök url'sine gittiğimde sadece bir 404 alıyorum ve nginx günlüğümde şunu almaya çalıştığını görüyorum:

my-nginx-container | 2017/05/12 21:07:01 [error] 6#6: *11 open() "/wwwroot/login" failed (2: No such file or directory), client: 172.20.0.1, server: , request: "GET /login HTTP/1.1", host: "localhost:8080"
my-nginx-container | 172.20.0.1 - - [12/May/2017:21:07:01 +0000] "GET /login HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0" "-"

Düzeltmeyi nerede aramalıyım?

React'teki yönlendirici bitim şöyle görünüyor:

render(

  <Provider store={store}>
    <MuiThemeProvider>
      <BrowserRouter history={history}>
        <div>
          Hello there p
          <Route path="/login" component={Login} />
          <App>

            <Route path="/albums" component={Albums}/>

            <Photos>
              <Route path="/photos" component={SearchPhotos}/>
            </Photos>
            <div></div>
            <Catalogs>
              <Route path="/catalogs/list" component={CatalogList}/>
              <Route path="/catalogs/new" component={NewCatalog}/>
              <Route path="/catalogs/:id/photos/" component={CatalogPhotos}/>
              <Route path="/catalogs/:id/photos/:photoId/card" component={PhotoCard}/>
            </Catalogs>
          </App>
        </div>
      </BrowserRouter>
    </MuiThemeProvider>
  </Provider>, app);

Ve nginx dosyam şöyle:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 8080;
        root /wwwroot;

        location / {
            root /wwwroot;
            index index.html;

            try_files $uri $uri/ /wwwroot/index.html;
        }


    }
}

DÜZENLE:

Kurulumun çoğunun çalıştığını biliyorum çünkü oturum açmadan localhost: 8080'e gittiğimde oturum açma sayfasını da alıyorum. bu localhost'a bir yönlendirme yoluyla değil: 8080 / login - bu bir tepki kodudur.


1
Parametreler, try_filesyol adları değil, URI olmalıdır. Deneyin:try_files $uri $uri/ /index.html;
Richard Smith,

@RichardSmith Tamam ... Bunu index.html dosyasının yol adı olarak gördüm. Bunu önerdiğiniz şekilde değiştirmeyi denedim - ama aynı sonucu alıyorum. ## / wwwroot / login "başarısız oldu (2: Böyle bir dosya veya dizin yok) ## başka önerileriniz var mı. Bunun içine dalacağım tonite ...
martin

@martin Bunu henüz çözebildiniz mi? Aynı şeyi görüyoruz, ancak zaten try_files satırına sahiptik.
Billy Ferguson

Yanıtlar:


243

Nginx yapılandırmanızdaki konum bloğu şöyle olmalıdır:

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

Sorun, index.html dosyasına yapılan isteklerin çalışmasıdır, ancak şu anda nginx'e diğer istekleri de index.html dosyasına iletmesini söylemiyorsunuz.


8
Daha gelişmiş yapılandırma (önbelleğe alma, eksik .js, .css dosyaları için 404) gkedge.gitbooks.io/react-router-in-the-real/content/nginx.html
Gianfranco S.

Görünüşe göre React Router sunucuya hiç gidiş-dönüş yol açmamalıdır ... bu yerel olarak engellenebilir mi?
Scotty H

nginx, isteği index.html dosyasına yönlendirmezse, React Router'ın içindeki JS, isteğin farkında bile olmayacaktır. Bu cevap, tüm istekleri React'e yönlendirerek React Router'ın tüm istekleri işlemesine izin verir.
Toby

Sunucu kökünü kullanan package.json'daki varsayılan ana sayfa ayarını kullanmak da önemlidir. Bunu '.' Olarak ayarladım (göreli yolları kullanın), ancak daha sonra nginx /custompath/static/main.js hizmetini sunmaya çalıştı, bu açıkça başarısız olacak ve çalışmayan bir site verecek.
boerre

sadece bir uyarı, yapılandırmanın gerçekten yüklendiğinden emin olun, benimki varsayılanla çelişiyordu ve atlanıyordu. sigh
4c74356b41

18

İşte çözümlerim

basit deneme:

location / {
    root /var/www/mysite;
    try_files $uri /index.html;
}

artık html olmayan türleri denemeye gerek yok:

location / {
    root /var/www/mysite;
    set $fallback_file /index.html;
    if ($http_accept !~ text/html) {
        set $fallback_file /null;
    }
    try_files $uri $fallback_file;
}

artık html olmayan türleri ve dizini denemeye gerek yok ( ve / veya try_filesile uyumlu hale getirme ):indexautoindex

location / {
    root /var/www/mysite;
    index index.html;
    autoindex on;
    set $fallback_file /index.html;
    if ($http_accept !~ text/html) {
        set $fallback_file /null;
    }
    if ($uri ~ /$) {
        set $fallback_file /null;
    }
    try_files $uri $fallback_file;
}

9

Belki buradaki durum tam olarak bu değildir, ancak projesi dockeriçin bir konteyner çalıştıran herkes için ve benim durumumda ihtiyacım olan her şeye sahiptim :reactreact-routerwebpack-dev-servernginx.conf

server {
    listen 80;
    location / {
      root   /usr/share/nginx/html;
      index  index.html index.htm;
      try_files $uri $uri/ /index.html;
    } 
    error_page 404 /index.html;
    location = / {
      root /usr/share/nginx/html;
      internal;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   /usr/share/nginx/html;
    }
  }

Ancak yine de nginx, 404 hatalarını köke göndermez /. Kapsayıcıya baktıktan sonra, yapılandırmalarımı bir /etc/nginx/conf.d/default.confşekilde geçersiz kılacak bazı yapılandırmalar olduğunu fark ettim , bu yüzden bu dosyayı silmek dockerfilesorunu çözdü:

...
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf  # <= This line solved my issue
COPY nginx.conf /etc/nginx/conf.d
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

1
Günümü kurtardın!
Bilal Hüseyin

4

İşte canlı sunucuda benim için çalışan çözüm:

Bu öğreticiyi yeni takip ettim ve temel Nginx yapılandırmasıyla sadece konum bloğunu yapılandırdım.

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

0

Benim için bir kök yönergesi ekleyene kadar hiçbir şey işe yaramadı. Bu, bir / api / webserver uç noktasına ulaşmak için bir ters proxy kullanarak da benim için çalıştı.

location / {
    root   /usr/share/nginx/html;
    try_files $uri /index.html;
}

0

Ben de aynı problemle uğraşıyordum ve bunun bir conf hatası olduğunu düşündüm ama hayır. Conf dosyasını /etc/nginx/conf.d/klasöre kopyalıyordum . Bu, geliştirmede çalışır, ancak derleme sürümünde bu soruna neden olur. Yol başarısız olduğunda nginx dizine geri dönmez.

Conf dosyasını doğru klasöre kopyalamanız yeterlidir: /etc/nginx/conf.d/default.conf

Örnek Dockerfile talimatı: COPY .docker/prod/nginx.conf /etc/nginx/conf.d/default.conf

Umarım yardımcı olur.


-1
location / {
    root /path/to/root/directory/of/staticfiles;
    index index.html;
    try_files $uri /index.html;
}

Stack Overflow'da yalnızca kod yanıtları önerilmez çünkü sorunu nasıl çözdüğünü açıklamazlar. Lütfen yanıtınızı bu kodun ne yaptığını ve mevcut yükseltilmiş yanıtlarda nasıl geliştiğini açıklamak için düzenleyin, böylece hem OP hem de benzer sorunları olan diğer kullanıcılar için yararlı olur.
FluffyKitten
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.