【发布时间】:2018-11-08 11:43:26
【问题描述】:
刚开始使用 React。我有一个使用 create-react-app 创建的应用程序,它应该在 sub-directory 上运行,同时对不同的路径进行 API 调用。
反应应用:
服务器上的位置:/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;
}
在客户端的package.json 中设置"homepage":"https://foo.example.com/analytics" 时,所有资源路径似乎都是正确的(即https://foo.example.com/analytics/static/...),但是在检查网络时,我的浏览器的网络检查器和应用程序中没有显示对.../api/data 的请求没有正确生成。
在App's API call(fetch('https://foo.example.com/api/data') 而不是fetch('/api/data'))中使用绝对路径似乎也无济于事。
当我在 package.json 中设置 "homepage":"." 并更改 Nginx 配置以在服务器根目录上提供 react 构建目录时,该应用程序可以正常工作。
server {
root /var/www/myapp/build;
}
但是,在这种情况下,该应用程序也可以在 https://foo.example.com 下使用,这是我不想要的。
我强烈怀疑这与路由有关,但不知道如何解决。因此,我们将不胜感激任何帮助!
--- 编辑/解决方案 ---
我怀疑这是最直接的解决方案,但以下设置对我有用:
反应应用
在package.json 中,在运行npm run build 之前设置"homepage":"./analytics"
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 作为后备。因此,正则表达式解决方法。
尽管如此,我们仍然非常欢迎您提出改进此解决方案的反馈。
【问题讨论】: