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

그리고 내 nginx 파일은 다음과 같습니다.

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;
Richard Smith

@RichardSmith OK ... index.html 파일의 경로 이름으로 보았습니다. 나는 당신이 제안한대로 변경하려고 시도했지만 동일한 결과를 얻었습니다. ## / wwwroot / login "실패 (2 : 해당 파일 또는 디렉토리 없음) ## 다른 제안 사항이 있습니까? tonite ...
martin

@martin 아직이 문제를 해결할 수 있었습니까? 우리는 똑같은 것을보고 있지만 이미 거기에 try_files 줄이 있습니다.
Billy Ferguson

답변:


240

nginx 구성의 위치 블록은 다음과 같아야합니다.

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

문제는 index.html 파일에 대한 요청이 작동하지만 현재 nginx에게 다른 요청을 index.html 파일로 전달하도록 지시하지 않는다는 것입니다.


8
고급 구성 (캐싱, .js, .css 파일 누락에 대한 404 등)을 확인하십시오. gkedge.gitbooks.io/react-router-in-the-real/content/nginx.html
Gianfranco P.

React Router가 서버로의 왕복을 전혀 일으키지 않아야하는 것 같습니다 ... 이것은 로컬에서 stymied 할 수 있습니까?
Scotty 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위해 컨테이너를 실행하는 모든 사람 을 위해 및 , 제 경우에는 필요한 모든 것이 있습니다 .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;
    }
  }

그러나 여전히 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
당신은 내 하루를 구했습니다!
Bilal Hussain

4

라이브 서버에서 나를 위해 작동하는 솔루션은 다음과 같습니다.

난 그냥 한 이 튜토리얼을 따라 하고 기본 Nginx의 구성으로 단순히 위치 블록을 구성.

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

0

나를 위해 루트 지시문을 추가하기 전까지는 아무것도 작동하지 않았습니다. 이것은 역방향 프록시를 사용하여 / api / 웹 서버 끝점에 도달했습니다.

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

0

나는 같은 문제를 다루고 있었고 그것이 conf 오류라고 생각했지만 아니요. 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

도움이되기를 바랍니다.


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

코드 전용 답변은 문제 해결 방법을 설명하지 않기 때문에 Stack Overflow에서 권장되지 않습니다. 이 코드가 수행하는 작업과 기존 upvoted 답변에서 어떻게 개선되는지 설명하기 위해 답변을 편집하여 유사한 문제가있는 다른 사용자뿐만 아니라 OP에도 유용합니다.
FluffyKitten
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.