У меня есть веб-сервер Nginx, настроенный для обслуживания приложения React JS. Приложение React использует React Router для выполнения маршрутов. У меня также есть серверы с REST API, к которым обращается приложение React.
У меня проблема с тем, что некоторые маршруты в моем приложении React могут загружаться, если я обновляю страницу. Например, если я захожу на сайт www.myapp.com/Users напрямую (не заходя на сайт www.myapp.com/ и не переходя туда), мое приложение конфигурации и Regin Nginx может загрузить файл index.html, содержащий приложение React, а затем загрузить правильный маршрут в приложении React.
Однако, тогда у меня есть параметризованные URL-маршруты, такие как www.myapp.com/User/:username, которые не работают. Это действительно странно. Если я запускаю свое приложение реагирования на локальном хосте с «npm start», тогда появляются параметризованные URL, если я перезагружаю страницу по некоторому параметризованному маршруту. Однако, как только я поместил его на свой рабочий сервер с Nginx, обслуживающим файл index.html, он больше не работает. Однако, если я использую ссылку из React Router, я все равно могу перейти к параметризованному URL-адресу, и он отображается правильно. Это не работает, только когда я перезагружаю веб-страницу или перехожу к параметризованному маршруту на моем производственном сервере Nginx. Все остальное работает нормально.
Мой файл конфигурации для Nginx выглядит следующим образом. Просто примечание, /etc/nginx/rest_proxy.conf просто содержит пропуск прокси. Я сомневаюсь, что это проблема. У меня много директив / location. Все они идут на серверные серверы REST API, которые у меня есть. Общая директива "location /" - это то, что должно загружать мое приложение React.
worker_processes 2;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log crit;
events {
multi_accept on;
worker_connections 4096;
use epoll;
}
http {
tcp_nopush on;
tcp_nodelay on;
gzip on;
gzip_comp_level 1;
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'$upstream_addr - $upstream_response_time - $request_time '
'"http_referer" "$http_user_agent" ';
upstream myapp1 {
server 127.0.0.1:3001;
#server 192.168.122.24:3001;
server 192.168.122.25:3001;
server 192.168.122.32:3001;
server 192.168.122.36:3001;
server 192.168.122.33:3001;
keepalive 64;
}
server {
listen 80;
server_name _;
root /var/www/react/frontend/build;
index index.html;
access_log /var/log/nginx/access.log custom;
include /etc/nginx/mime.types;
location = /adduser {
include /etc/nginx/rest_proxy.conf;
}
location = /login {
include /etc/nginx/rest_proxy.conf;
}
location = /logout {
include /etc/nginx/rest_proxy.conf;
}
location = /verify {
include /etc/nginx/rest_proxy.conf;
}
location = /search {
include /etc/nginx/rest_proxy.conf;
}
location = /CheckLoginStatus {
include /etc/nginx/rest_proxy.conf;
}
location = /DropDatabase {
include /etc/nginx/rest_proxy.conf;
}
location = /ConfigureDatabase {
include /etc/nginx/rest_proxy.conf;
}
location = /addmedia {
include /etc/nginx/rest_proxy.conf;
}
location /questions/ {
include /etc/nginx/rest_proxy.conf;
break;
}
location /user/ {
include /etc/nginx/rest_proxy.conf;
break;
}
location /answers/ {
include /etc/nginx/rest_proxy.conf;
break;
}
location /media/ {
include /etc/nginx/rest_proxy.conf;
break;
}
location / {
try_files $uri /index.html;
}
}
}
Это моя декларация маршрута React Router. Как я уже сказал, все отлично работает на моей локальной машине, поэтому я очень подозреваю, что это мои настройки с Nginx.
render() {
var status = this.state.loggedIn;
return (
<React.Fragment>
<NavBar loggedIn={status} />
<Route exact path = "/" render={ (props) => <Home {...props} loggedIn={status} getLoginStatus={this.getLoginStatus} setLoginState={this.setLoginState} /> } />
<Route path="/Questions" render={ (props) => <QuestionsPage {...props} notification={this.state.notification} loggedIn={status} getLoginStatus={this.getLoginStatus} setLoginState={this.setLoginState} /> } />
<Route path="/Question/:id" render={ (props) => <QuestionPage {...props} notification={this.state.notification} loggedIn={status} getLoginStatus={this.getLoginStatus} setLoginState={this.setLoginState} /> } />
<Route path="/Users" render={ (props) => <UsersPage {...props} notification={this.state.notification} loggedIn={status} getLoginStatus={this.getLoginStatus} setLoginState={this.setLoginState} /> } />
<Route path="/User/:username" render={ (props) => <UserPage {...props} notification={this.state.notification} loggedIn={status} getLoginStatus={this.getLoginStatus} setLoginState={this.setLoginState} /> } />
</React.Fragment>
);
}
Я привел пример того, что мой параметризованный маршрут / User /: имя пользователя не работает, но то же самое относится и к моему / Question /: id маршруту.
Любая помощь приветствуется.