React-router и nginx

Я переношу свое приложение-ответ с webpack-dev-сервера на 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;
        }


    }
}

EDIT:

Я знаю, что большая часть настроек работает, потому что, когда я перехожу на localhost: 8080, не будучи зарегистрированным, я также получаю страницу входа. это не переадресация на localhost: 8080/login - это какой-то код реакции.

Ответ 1

Блок местоположения в вашей конфигурации nginx должен быть:

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

Проблема заключается в том, что запросы к файлу index.html работают, но вы в настоящее время не говорите nginx пересылать другие запросы в файл index.html тоже.

Ответ 2

Вот мои решения

простая попытка:

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

больше не try_files пытаться использовать не-html-типы и каталоги (делая try_files совместимыми с index и/или autoindex):

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

Ответ 3

Вот решение, которое работает для меня на живом сервере:

Я только что следовал этому уроку и с базовой конфигурацией Nginx просто настроил блок местоположения.

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

Ответ 4

У меня ничего не получалось, пока я не добавил корневую директиву. Это также помогло мне использовать обратный прокси-сервер для подключения к конечной точке /api/webserver.

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

Ответ 5

Я имел дело с той же проблемой, и я подумал, что это ошибка с ошибкой, но нет. Я копировал файл 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

Надеюсь, это поможет.