React-routerとnginx


107

反応アプリをwebpack-dev-serverからnginxに移行しています。

ルートURL "localhost:8080 / login"にアクセスすると、404が表示され、nginxログで取得しようとしていることがわかります。

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" "-"

どこで修正を探すべきですか?

反応で私のルータービットは次のようになります:

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);

そして、このような私のginxファイル:

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;
        }


    }
}

編集:

ログインせずにlocalhost:8080にアクセスすると、ログインページも表示されるため、ほとんどの設定が機能することがわかります。これはlocalhost:8080 / loginへのリダイレクトを介したものではありません-いくつかの反応コードです。


1
へのパラメータtry_filesは、パス名ではなくURIである必要があります。試してみてくださいtry_files $uri $uri/ /index.html;
リチャード・スミス

@RichardSmith OK ... index.htmlファイルへのパス名として見ました。私はあなたが提案したものに変更しようとしましたが、同じ結果が得られました。## / wwwroot / login "が失敗しました(2:そのようなファイルまたはディレクトリはありません)##他に提案はありますか?私はそれについて詳しく説明します...
martin

@martinこれを解決できましたか?同じことが表示されていますが、既にtry_files行が含まれています。
ビリーファーガソン

回答:


238

nginx構成のロケーションブロックは次のようになります。

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

問題は、index.htmlファイルへのリクエストが機能することですが、現在nginxに他のリクエストもindex.htmlファイルに転送するように指示していません。


8
より詳細な構成(キャッシュ、.js、.cssファイルがない場合は404など)については
Gianfranco P.

React Routerがサーバーへの往復を引き起こすべきではないようです...これはローカルで妨げられますか?
スコッティH

nginxがリクエストをindex.htmlファイルにルーティングしない場合、React Router内のJSはリクエストを認識しません。この回答はすべてのリクエストをReactにルーティングし、React Routerがすべてのリクエストを処理できるようにします。
Toby

サーバールートを使用するpackage.jsonのデフォルトのホームページ設定を使用することも重要です。「。」に設定しました(相対パスを使用)が、nginxは/custompath/static/main.jsを提供しようとしましたが、これは明らかに失敗し、機能しないサイトが提供されます。
boerre

ただのヘッドアップ、あなたの設定が実際にロードされていることを確認してください、私のはデフォルトと競合していてスキップされました。ため息
4c74356b41

18

これが私の解決策です

単純な試み:

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

HTML以外のタイプを試そうとしない:

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

HTML以外のタイプやディレクトリを試す必要はありません(およびとtry_files互換性を持たせる):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

多分これは、しかし、実行している人のために、ここで正確なケースではないdocker彼らのためのコンテナreactでプロジェクトをreact-routerしてwebpack-dev-server、私の場合、私は私が私の中で必要なすべてを持っていましたnginx.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;
    }
  }

しかし、それでもnginxは404エラーをルートに送信しません/。コンテナーを調べた後、/etc/nginx/conf.d/default.confなんらかの方法で私の構成をオーバーライドする構成があることに気づきました。そのため、私のファイルを削除するとdockerfile問題が解決しました。

...
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
あなたは私の日を救った!
ビラルフセイン


0

私にとっては、ルートディレクティブを追加するまで何も機能しませんでした。これは、リバースプロキシを使用して/ api / webserverエンドポイントに到達するためにも機能しました。

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

0

私は同じ問題を扱っていて、それは設定エラーだと思いましたが、違いました。confファイルを/etc/nginx/conf.d/フォルダーにコピーしていました。これはdevでは機能しますが、ビルドバージョンでは問題が発生します。ルートが失敗した場合、nginxはインデックスにフォールバックしません。

confファイルを適切なフォルダにコピーするだけです。 /etc/nginx/conf.d/default.conf

Dockerfile命令の例: COPY .docker/prod/nginx.conf /etc/nginx/conf.d/default.conf

それが役に立てば幸い。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.