Przenoszę moją aplikację React z serwera webpack-dev-server na nginx.
Kiedy przechodzę do głównego adresu URL „localhost: 8080 / login”, po prostu otrzymuję 404 iw moim dzienniku nginx widzę, że próbuje uzyskać:
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" "-"
Gdzie mam szukać poprawki?
Mój router reaguje tak:
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);
A mój plik nginx taki:
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;
}
}
}
EDYTOWAĆ:
Wiem, że większość konfiguracji działa, ponieważ kiedy przechodzę do localhost: 8080 bez zalogowania się, otrzymuję również stronę logowania. nie dzieje się tak przez przekierowanie na localhost: 8080 / login - to jakiś kod reakcji.
nginx
react-router
jaskółka oknówka
źródło
źródło
try_files
powinny być identyfikatorami URI, a nie nazwami ścieżek. Spróbuj:try_files $uri $uri/ /index.html;
Odpowiedzi:
Blok lokalizacji w twojej konfiguracji nginx powinien być:
Problem polega na tym, że żądania wysyłane do pliku index.html działają, ale obecnie nie mówisz nginx, aby przekazywał również inne żądania do pliku index.html.
źródło
Oto moje rozwiązania
proste wypróbowanie:
koniec z próbami wyszukiwania typów innych niż HTML:
koniec z próbami wyszukiwania typów i katalogów innych niż HTML (
try_files
zapewnienie zgodności zindex
i / lubautoindex
):źródło
Może to nie jest dokładny przypadek tutaj, ale dla każdego, kto jest uruchomiona
docker
pojemnik dla swojegoreact
projektu zreact-router
iwebpack-dev-server
, w moim przypadku miałem wszystko, co potrzebne w moimnginx.conf
:Ale nadal nginx nie wyśle błędów 404 do katalogu głównego
/
. Po przejrzeniu kontenera zauważyłem, że jest kilka konfiguracji,/etc/nginx/conf.d/default.conf
które w jakiś sposób nadpisują moje konfiguracje, więc usunięcie tego pliku w moimdockerfile
rozwiązało problem:źródło
Oto rozwiązanie, które działa dla mnie na serwerze live:
Właśnie skorzystałem z tego samouczka i przy podstawowej konfiguracji Nginx po prostu skonfigurowałem blok lokalizacji.
źródło
Dla mnie nic nie działało, dopóki nie dodałem dyrektywy roota. To zadziałało dla mnie również przy użyciu zwrotnego serwera proxy do trafienia w punkt końcowy / api / webserver.
źródło
Miałem do czynienia z tym samym problemem i pomyślałem, że to błąd conf, ale nie. Kopiowałem plik conf do
/etc/nginx/conf.d/
folderu. To działa w programowaniu, ale w wersji kompilacji powoduje ten problem. Gdy trasa nie powiedzie się, nginx nie powraca do index.Po prostu skopiuj plik conf do odpowiedniego folderu:
/etc/nginx/conf.d/default.conf
Przykładowa instrukcja Dockerfile:
COPY .docker/prod/nginx.conf /etc/nginx/conf.d/default.conf
Mam nadzieję, że to pomoże.
źródło
źródło