reactjs - Nginx + 带有路由器的 React 应用程序 + Chrome = 子文件夹不起作用
问题描述
我有一个在 nginx 下运行的反应应用程序。应用程序运行良好,没有任何问题。
现在,我在同一台服务器上运行 kibana 和 portainer,并且我将 nginx 配置为将它们作为子文件夹运行。服务器有一个安全证书,我不能真正创建新的子域。所以我不得不使用子文件夹。
server {
listen 80;
listen 443 ssl;
server_name api.nec.private.systems;
ssl_certificate /etc/ssl/api.nec.private.systems.crt;
ssl_certificate_key /etc/ssl/api.nec.private.systems.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
root /usr/share/nginx/html;
location / {
# Set path
try_files $uri /index.html;
}
# Do not cache sw.js, required for offline-first updates.
location /sw.js {
add_header Cache-Control "no-cache";
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
expires off;
access_log off;
}
location /control/ {
proxy_pass http://portainer:9000/;
add_header Cache-Control "no-cache";
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
expires off;
access_log off;
}
location /kibana/ {
proxy_pass http://kibana:5601/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
# proxy_cache_bypass $http_upgrade;
add_header Cache-Control "no-cache";
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
expires off;
access_log off;
}
}
如您所见,前两个位置描述了 react 应用程序,后两个位置都是关于 kibana 和 poratiner。
现在,问题来了:
- 我会打开谷歌浏览器并转到 api.nec.private.systems/control - 它会毫无问题地拉起搬运工。
- 我会打开 api.nec.private.systems/kibana 并按预期获得 kibana。
- 我会打开 api.nec.private.systems/ 并打开带有反应路由器的反应应用程序。
现在,完成第 3 步后,我将打开 api.nec.private.systems/kibana,它不再打开 kibana,而是尝试在我的路由器中输入 /kibana。它根本不会打开 kibana。不管我会尝试多少。
第 X 步 - 清除谷歌浏览器的缓存并重试 - kibana 和 poirtainer 工作得很好。直到我打开反应应用程序。
有任何想法吗?
解决方案
好的,所以我在这里找到了自己的问题。这一切都归功于 create-react-app 附带的 service worker。基本上,服务工作者试图将所有请求从应用程序重定向到本地存储缓存。
杀死了服务,它开始正常工作。
推荐阅读
- angular - 如何在角度6中的ngb-progressbar的值字段中分配动态值
- angular - 我可以在 Angular 6 单元测试中使用“this”吗?
- python - Virtualenv 需要 env
- c++ - SFINAE 是否依赖于类型扣除?
- ios - 在 SpriteKit 场景之间传递数据 (Swift)
- postgresql - 我们正面临“恐慌:无法从控制文件中读取:成功
- php - Joomla!- 将类添加到菜单中的标签
- javascript - Symfony 复选框默认选中,但如果在持久化后未选中则不会
- javascript - Jestjs如何测试在另一个函数中调用的函数
- c - 在 Ubuntu 16.04 上找不到 printf.c