Proxy todas las solicitudes de Nginx a un backend, excepto un archivo estático

Proxy todas las solicitudes de Nginx a un backend, excepto un archivo estático

Utilizo Nginx para revertir el proxy de una API de backend. Sin embargo, me gustaría que Nginx entregue un archivo estático llamado "readme.html" cuando se realiza una solicitud a "/".

Hice una extensa investigación. La solución más prometedora parecía ser ésta:https://stackoverflow.com/a/15467555/2237433.

Intentando aplicar esa solución a mi caso, aquí está mi código. Aquí está mi Dockerfile:

# syntax=docker/dockerfile:1
FROM nginx:1.22.0-alpine
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./readme.html /www/
EXPOSE 80

Con mi contenedor Nginx ejecutándose, puedo conectarme a un shell y ejecutarlo cat /www/readme.htmlpara confirmar que el archivo está realmente presente.

Ahora aquí está mi nginx.conf:

# a lot of stuff
http {
    # a lot of stuff
    proxy_cache_path  /data/nginx/cache keys_zone=my-zone:10m;
    server {

        listen 80;
        add_header X-Cache-Status $upstream_cache_status always;

        location / {
            root /www/;
            try_files readme.html @backend;
        }

        location @backend {
            proxy_pass http://api:8080;
            proxy_cache my-zone;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            proxy_cache_lock on;
        }

    }
}

Con esta configuración, todas mis rutas funcionan como se esperaba, excepto que cuando ejecuto una solicitud en "/", aparece un error 404. El 404 en realidad proviene del backend. Aquí está el registro del backend después de la solicitud:

[20/Jun/2022 01:51:06] "GET / HTTP/1.0" 404 -

Entonces, la solicitud "/" en realidad se pasó al backend.

Intenté una gran cantidad de ajustes en esa configuración, pero fue en vano. ¡Gracias por su ayuda!

Respuesta1

Puede reescribir explícitamente el URI de solicitud "raíz":

location = / {
    root /www;
    rewrite ^ /readme.html break;
}
location / {
    proxy_pass http://api:8080;
    ...
}

O puede utilizar readme.htmlcomo archivo de índice:

location / {
    root /www;
    index readme.html;
    try_files $uri $uri/ @backend;
}

Respuesta2

Encontré una solución funcional. Resulta que el location /bloque tenía que ser así:

location / {
    root /www;
    try_files $uri/readme.html @backend;
}

No puedo decir que realmente entienda por qué, así que si alguien puede explicar el motivo detrás de esto, se lo agradecería.

información relacionada