Ubuntu部署多CRA React应用 刷新或加斜杠报EISDIR错误如何解决
EISDIR报错的核心根因
这是操作系统层面抛出的“试图将目录作为普通文件读取”的系统错误,和CRA的构建配置(PUBLIC_URL、homepage参数)完全无关——错误来源是部署用的静态Web服务器(Nginx/Apache等)的路径映射逻辑缺陷。
当你访问带末尾斜杠的路径(如/app1/)、或是触发前端路由跳转后刷新页面时,服务器没有正确将目录请求映射到对应静态构建目录下的index.html文件,反而尝试把物理磁盘上的目录本身当成可读取的文件去响应请求,就会触发EISDIR报错。
你之前调整PUBLIC_URL、homepage的操作,本质是修改构建产物里的静态资源引用路径,完全不触碰服务器层的请求解析逻辑,自然无法解决问题。
对应修复步骤
调整静态服务器配置(核心修复)
根据你实际使用的静态服务软件匹配修改:
- 若使用Nginx部署
- 定位到
/app1、/app2对应的location配置段 - 参考如下逻辑调整核心配置:
# app1 路径映射 location /app1/ { # 填写app1构建产物实际存放的物理绝对路径,末尾要带斜杠 alias /var/www/react-apps/app1/build/; index index.html; # 关键:配置路径兜底,避免目录被误读为文件 try_files $uri $uri/ /app1/index.html; } # app2 路径映射 location /app2/ { alias /var/www/react-apps/app2/build/; index index.html; try_files $uri $uri/ /app2/index.html; } - 执行
nginx -t校验配置语法,确认无错后执行reload让配置生效
- 定位到
- 若使用Apache部署
- 找到两个应用对应物理目录的配置块
- 确认配置中开启了
DirectoryIndex index.html,移除会拦截目录访问的冗余规则,保证目录请求会自动返回目录下的index.html文件
对齐CRA构建参数
服务器配置修复完成后,再反向调整前端项目的构建配置,避免路径不匹配:
- app1项目的
package.json中设置"homepage": "/app1"(末尾无多余斜杠) - app2项目的
package.json中设置"homepage": "/app2" - 不需要额外在
.env.production中重复设置PUBLIC_URL,CRA会自动读取homepage的值生成正确的静态资源引用路径,避免两个配置值不一致引发的资源404。
常见踩坑规避
- 配置Nginx路径映射时,不要把
alias写成root:如果用root配置,Nginx会自动把请求路径拼接到物理根路径后,去查找/var/www/react-apps/app1/build/app1/这类不存在的嵌套目录,进一步触发路径解析错误 - 建议对不带末尾斜杠的访问路径(如
https://example.com/app1)配置301重定向到带斜杠的路径(https://example.com/app1/),减少路径匹配逻辑的混乱
内容的提问来源于stack exchange,提问作者Игор Ташевски
相关产品推荐
相关产品推荐

