¿Cómo configuro un bloque de ubicación para que siempre devuelva un único archivo en nginx?

12

En mi aplicación, quiero que la ubicación "/" devuelva un archivo index.html estático, quiero que "/ static" sirva los archivos estáticos de una carpeta y quiero que todas las demás solicitudes devuelvan 404 NOT FOUND. En un momento posterior, redirigiré todas las demás solicitudes a un servidor WSGI.

Esta es actualmente mi configuración:

# Dev server.
server {
    listen 1337;
    charset UTF-8;

    location / {
        rewrite ^ static/index_debug.html break;
    }

    location /static {
        alias /home/tomas/projects/streamcore/static;
    }
}

La carpeta estática funciona perfectamente, pero "/" devuelve 404 NOT FOUND. También he intentado:

alias /home/tomas/projects/streamcore/static/index_debug.html;

En el bloque de ubicación, pero eso devuelve 500 ERROR DE SERVIDOR INTERNO. Parece que aliasno le gustan los archivos individuales. Además he intentado:

try_files static/index_debug.html;

Pero eso impide que el servidor comience con el error "número inválido de argumentos en la directiva try_files". Aparentemente, en try_filesrealidad requiere que pruebes más de un archivo, que no es el comportamiento que estoy buscando.

Entonces mi pregunta es: ¿cómo configuro un bloque de ubicación para que siempre devuelva un archivo estático?


EDITAR: He visto en otras respuestas que aliasdeberían aceptar un solo archivo como argumento, así que intenté:

location = / {
    alias /home/tomas/projects/streamcore/static/index_debug.html;
}

Pero todavía solo obtengo 500 ERRORES DE SERVIDOR INTERNO. El registro de errores para la solicitud "/" dice:

[alerta] 28112 # 0: * 7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" no es un directorio

¿Por qué está tratando de abrir "index_debug.htmlindex.html"? No estoy usando la indexdirectiva en ningún lado.

Hubro
fuente
¿Puedestry_files static/index_debug.html static/index_debug.html;
ceejayoz
@ceejayoz: Al intentar su sugerencia location =/, obtengo 404 NOT FOUND y location /recibo 500 ERROR DE SERVIDOR INTERNO.
Hubro
Si no me equivoco, te estás perdiendo la directiva Index ... Cualquier servidor web siempre buscará el archivo index, proporcionando el URI raíz (/), creo que puedes anular esto agregando:location / { return 404; }
Martino Dino
@MartinoDino: ¿Por qué lo necesito? ¿Y donde?
Hubro
location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino

Respuestas:

10

Acabo de probar esto y funciona para mí:

server {
    root /tmp/root;
    server {
        listen 8080;
        location /static {
            try_files $uri =404;
        }
        location / {
            rewrite ^ /static/index_debug.html break;
        }
    }
}

El archivo /tmp/root/static/index_debug.htmlexiste, por supuesto :)

Puedo presionar cualquier URL y solo obtengo la página estática.

chrskly
fuente
0

Puede usar try_files y una redirección a una ubicación con nombre con rewrite. Me gusta esto:

server {
    root /tmp/root;
    server {
        listen 8080;

        location / {
            try_files $uri $uri/ @index;
        }

        location @index {
            rewrite ^ static/index_debug.html break;
        }
    }
}

Si el archivo existe en /tmp/rootél, se servirá, de lo contrario, se reescribirá uri static/index_debug.htmly se servirá.

Kirill Zaitsev
fuente