Andy
Andy

Reputation: 384

Nginx 500 Interal Server Error with React app - 1 rewrite or internal redirection cycle while internally redirecting to "/index.html"

Here's my nginx default.conf file:

server {
    listen 3000;

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

Here's my 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

If I look inside my Docker container, I can see the files are all where they should be: enter image description here

Also for context, I'm also using nginx for routing, with this config:

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;
    }

}

However, if I try to navigate to localhost:81, I get this error:

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"    

Any ideas what the issue could be? Most other threads I've looked at focus on this bit, but I already have it and I'm sure the file locations are all correct.:

server {
    listen 3000;

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

Another thread suggested adding "homepage": "./" to the package.json file, but this didn't seem to make any difference either.

Upvotes: 2

Views: 3974

Answers (1)

Andy
Andy

Reputation: 384

Was able to get an answer from Michael Hampton on serverfault:

Fix the typo in your root directive.

The leading / is missing, thus nginx considers the path relative to a compiled-in default (usually /etc/nginx on Linux).

What is actually happening is that the directory /etc/nginx/usr/share/nginx/html does not exist. So when processing try_files, nginx first tries $uri which fails, then it tries $uri/ which processes the paths in the index directive. None of these exist either. Finally it reaches /index.html, which it feeds back to try_files, but as that is the same path it just tried in index processing, it detects the infinite loop and bails out.

So all I had to do was change this

root usr/share/nginx/html;

to this:

root /usr/share/nginx/html;

Upvotes: 2

Related Questions