React 应用程序出现 Nginx 500 内部服务器错误 - 内部重定向到“/index.html”时进行 1 次重写或内部重定向循环

React 应用程序出现 Nginx 500 内部服务器错误 - 内部重定向到“/index.html”时进行 1 次重写或内部重定向循环

我正在尝试提供一些通过npm run build使用 create-react-app 运行生成的静态内容。这是我的 nginx default.conf 文件:

server {
    listen 3000;

    location / {
        root usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}

这是我的 Dockerfile:

FROM node:14-slim as builder
WORKDIR "/app"
COPY ./package.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx
EXPOSE 3000
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html

如果我查看我的 Docker 容器内部,我可以看到所有文件都在它们应该在的位置:https://i.stack.imgur.com/H4hy7.png

另外,就上下文而言,我也使用 nginx 进行路由,配置如下:

upstream client {
    server client:3000;
}

upstream api {
    server api:3001;
}

server {
    listen 81;

    location / {
        proxy_pass http://client;
    }

    location /api {
        rewrite /api/(.*) /$1 break;
        proxy_pass http://api;
    }

     location /sockjs-node {
        proxy_pass http://client;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

}

但是,如果我尝试导航到 localhost:81,我会收到此错误:

client_1   | 2021/02/18 15:46:35 [error] 28#28: *10 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 172.18.0.3, server: , request: "GET / HTTP/1.0", host: "client"    

你知道问题可能是什么吗?我看过的大多数其他帖子都关注这一点,但我已经拥有它,并且我确信文件位置都是正确的。:

server {
    listen 3000;

    location / {
        root usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri $uri/ /index.html; <-- this line here
    }
}

另一个线程建议"homepage": "./在文件中添加“ package.json,但这似乎也没有什么区别。

答案1

修正指令中的拼写错误root

        root usr/share/nginx/html;

/缺少前导,因此 nginx 认为该路径相对于编译后的默认值(通常/etc/nginx在 Linux 上)。

实际发生的情况是目录/etc/nginx/usr/share/nginx/html不存在。因此,在处理时try_files,nginx 首先尝试$uri失败,然后尝试$uri/处理指令中的路径index。这些都不存在。最后它到达/index.html,并将反馈给try_files,但由于这是它在处理时尝试的相同路径index,因此它检测到无限循环并退出。

相关内容