Ich stelle meine Reaktions-App von Webpack-Dev-Server auf Nginx um.
Wenn ich zur Root-URL "localhost: 8080 / login" gehe, erhalte ich einfach eine 404 und in meinem Nginx-Protokoll sehe ich, dass versucht wird:
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" "-"
Wo soll ich nach einer Lösung suchen?
Mein Router, der reagiert, sieht folgendermaßen aus:
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);
Und meine Nginx-Datei sieht so aus:
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;
}
}
}
BEARBEITEN:
Ich weiß, dass der Großteil des Setups funktioniert, denn wenn ich zu localhost: 8080 gehe, ohne angemeldet zu sein, erhalte ich auch die Anmeldeseite. Dies geschieht nicht durch eine Umleitung zu localhost: 8080 / login - es handelt sich um einen Reaktionscode.
nginx
react-router
Martin
quelle
quelle
try_files
sollten URIs und keine Pfadnamen sein. Versuchen Sie:try_files $uri $uri/ /index.html;
Antworten:
Der Standortblock in Ihrer Nginx-Konfiguration sollte sein:
Das Problem ist, dass Anforderungen an die Datei index.html funktionieren, aber Sie weisen nginx derzeit nicht an, andere Anforderungen auch an die Datei index.html weiterzuleiten.
quelle
Hier sind meine Lösungen
einfacher Versuch:
Kein Versuch mehr für Nicht-HTML-Typen:
Sie müssen nicht mehr nach Nicht-HTML-Typen und -Verzeichnissen suchen (
try_files
kompatibel mitindex
und / oderautoindex
):quelle
Vielleicht ist dies hier nicht der genaue Fall, aber für jeden, der einen
docker
Container für seinreact
Projekt mit betreibt,react-router
undwebpack-dev-server
in meinem Fall hatte ich alles, was ich brauchtenginx.conf
:Trotzdem würde Nginx keine 404 Fehler an die Wurzel senden
/
. Nachdem ich in den Container/etc/nginx/conf.d/default.conf
geschaut hatte, bemerkte ich, dass es einige Konfigurationen gibt, die meine Konfigurationen irgendwie überschreiben würden. Das Löschen dieser Datei in meinem hatdockerfile
das Problem gelöst:quelle
Hier ist die Lösung, die für mich auf dem Live-Server funktioniert:
Ich habe gerade dieses Tutorial befolgt und mit der grundlegenden Nginx-Konfiguration einfach den Standortblock konfiguriert.
quelle
Für mich hat nichts funktioniert, bis ich eine Root-Direktive hinzugefügt habe. Dies funktionierte bei mir auch mit einem Reverse-Proxy, um einen / api / webserver-Endpunkt zu erreichen.
quelle
Ich hatte mit dem gleichen Problem zu tun und dachte, das sei ein Conf-Fehler, aber nein. Ich habe die conf-Datei in den
/etc/nginx/conf.d/
Ordner kopiert . Das funktioniert in dev, aber in der Build-Version verursacht dieses Problem. Wenn die Route fehlschlägt, greift der Nginx nicht auf den Index zurück.Kopieren Sie einfach die conf-Datei in den richtigen Ordner:
/etc/nginx/conf.d/default.conf
Beispiel für eine Dockerfile-Anweisung:
COPY .docker/prod/nginx.conf /etc/nginx/conf.d/default.conf
Ich hoffe es hilft.
quelle