[nginx] React-router 및 nginx

내 반응 앱을 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으로의 리디렉션을 통하지 않고 일부 반응 코드입니다.



답변

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

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

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


답변

내 솔루션은 다음과 같습니다.

간단한 시도 :

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


답변

아마도 이것은 여기에서 정확한 경우는 아니지만 프로젝트를 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;"]


답변

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

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

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


답변

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

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


답변

나는 같은 문제를 다루고 있었고 그것이 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

도움이되기를 바랍니다.


답변

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