刚开始使用 React。我创建了一个应用程序,create-react-app
它应该运行一段sub-directory
时间,同时对不同的路径进行 API 调用。
react应用程序:
服务器上的位置: /var/www/myapp/build
端点: https://foo.example.com/analytics
数据 API 端点: https://foo.example.com/api/data
Nginx 设置
location /analytics {
root /var/www/myapp/build;
try_files $uri /index.html;
}
"homepage":"https://foo.example.com/analytics"
在客户端的 中设置时package.json
,所有资源路径似乎都是正确的(即https://foo.example.com/analytics/static/...
),但是在检查网络时没有请求.../api/data
显示在我的浏览器的网络检查器中,并且应用程序没有正确生成。
在App's API call
(fetch('https://foo.example.com/api/data')
而不是fetch('/api/data')
) 中使用绝对路径似乎也无济于事。
而不是当我设置"homepage":"."
的package.json
,改变它的Nginx的配置担任服务器的根目录,应用程序的作品reactbuild目录。
server {
root /var/www/myapp/build;
}
但是,在这种情况下,该应用程序也可以在 下使用https://foo.example.com
,这是我不想要的。
我强烈怀疑这与路由有关,但无法弄清楚如何解决它。所以任何帮助将不胜感激!
--- 编辑/解决方案 ---
我怀疑这是最直接的解决方案,但以下设置对我有用:
react应用
在package.json
,"homepage":"./analytics"
运行前设置npm run build
Nginx 配置:
location = /analytics {
root /var/www/myapp/build;
try_files /index.html =404;
}
location ~ ^/analytics(.*) {
root /var/www/myapp/build;
try_files $1 $1/ /index.html =404;
}
我的理解是,使用的初始设置try_files $uri
是在根目录中/var/www/myapp/build
查找完整 uri 的文件,而不仅仅是后面的路径/analytics
。例如,当请求../analytics/css/styles.css
它时,它会检查一个/var/www/mayapp/build/analytics/css/styles.css
不存在的文件(或目录)是否可用,因此它继续index.html
作为后备。因此,正则表达式解决方法。
不过,改进此解决方案的反馈仍然非常受欢迎。