刚开始使用 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 配置以在服务器根目录上提供 react 构建目录,该应用程序可以工作。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
作为后备。因此,正则表达式解决方法。不过,改进此解决方案的反馈仍然非常受欢迎。
最佳答案
我正在努力解决同样的问题。最后,我能够使用官方文档和答案组合解决它:
假设:
create-react-app
包(您正在使用 react-router-dom
)。 react 应用程序更改 :
基于 official documentation .
BrowserRouter
通过添加 basename
.示例:<BrowserRouter history={history} basename="/webapp">
. homepage
在您的 package.json
.示例:"homepage": "/webapp"
. src="/static/logo/logo.png"
变成 src="/webapp/static/logo/logo.png"
. Nginx 变化 :
location ^~ /webapp {
alias /var/www/myapp/build;
try_files $uri $uri/ /webapp/index.html;
}
关于reactjs - React & nginx 路由到子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53207059/