React-router и nginx

109

Я перехожу свое приложение для реагирования с 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;
Ричард Смит
@RichardSmith Хорошо ... Я видел это как путь к файлу index.html. Я попытался изменить его на то, что вы предложили, но получил тот же результат. ## / wwwroot / login "не удалось (2: нет такого файла или каталога) ## у вас есть другие предложения. Я погрузюсь в это сегодня ...
Мартин
@martin вы уже смогли это решить? Мы видим то же самое, но там уже есть строка try_files.
Билли Фергюсон

Ответы:

246

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

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

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

Тоби
источник
8
Проверьте это для более продвинутой конфигурации (кеширование, 404 на отсутствие файлов .js, .css и т. Д.) Gkedge.gitbooks.io/react-router-in-the-real/content/nginx.html
Джанфранко П.
Похоже, что React Router вообще не должен вызывать двусторонний обход сервера ... можно ли заблокировать это локально?
Scotty H
1
если nginx не направляет запрос в файл index.html, тогда JS внутри React Router никогда даже не узнает о запросе. Этот ответ направляет все запросы в React, позволяя React Router обрабатывать все запросы.
Тоби
Также важно использовать настройку домашней страницы по умолчанию в package.json, которая использует корень сервера. Я установил для него значение '.' (Использовать относительные пути), но затем nginx попытался обслужить /custompath/static/main.js, что, очевидно, потерпит неудачу, давая неработающий сайт.
boerre
1
просто предупреждайте, убедитесь, что ваша конфигурация действительно загружается, моя конфигурация противоречила значениям по умолчанию и просто пропускалась. вздох
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совместимым с 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;
}
Fuweichin
источник
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
Ты спас мне день!
Билал Хуссейн,
4

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

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

location / {
    try_files $uri $uri/ /index.html;
}
Фатема Т. Зухора
источник
0

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

location / {
    root   /usr/share/nginx/html;
    try_files $uri /index.html;
}
Джазепи
источник
0

У меня была та же проблема, и я подумал, что это ошибка conf, но нет. Копировал файл conf в /etc/nginx/conf.d/папку. Это работает в dev, но в версии сборки вызывает эту проблему. При сбое маршрута nginx не откатывается к index.

Просто скопируйте файл conf в нужную папку: /etc/nginx/conf.d/default.conf

Пример инструкции Dockerfile: COPY .docker/prod/nginx.conf /etc/nginx/conf.d/default.conf

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

Diogopalhais
источник
0

Вот несколько шагов, которые я предпринял, которые могут помочь, если вы только начинаете

  1. После того, как в SSH необходимости вернуться к корню , /используя cd ..то вы должны быть в/
  2. Затем найдите файл .conf, обычно расположенный на /etc/nginx/sites-available/{yoursitename or default}компакт-диске впереди, чтобы перейти к нему.
  3. отредактируйте этот файл с помощью nanoили vimя использовал Vim вот такvi {your site.conf}
  4. Здесь содержимое всего файла, который должен работать
server {
        listen       80;
        server_name www.yourDomainName.com, yourDomainName.com;
        location / {
            root   /usr/share/nginx/{location of the build of your react project};
            index  index.html index.htm;
            
            try_files $uri $uri/ /index.html;

            passenger_enabled on;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
jso1919
источник
-1
location / {
    root /path/to/root/directory/of/staticfiles;
    index index.html;
    try_files $uri /index.html;
}
сагарпатидар
источник
Ответы только на код не приветствуются в Stack Overflow, потому что они не объясняют, как это решает проблему. Измените свой ответ, чтобы объяснить, что делает этот код и как он улучшает существующие ответы, за которые проголосовали, чтобы он был полезен OP, а также другим пользователям с аналогичными проблемами.
FluffyKitten