Назад | Перейти на главную страницу

Как настроить блок местоположения так, чтобы он всегда возвращал один файл в nginx?

В моем приложении я хочу, чтобы местоположение «/» возвращало статический файл index.html, я хочу, чтобы «/ static» обслуживал статические файлы из папки, и я хочу, чтобы все остальные запросы возвращали 404 NOT FOUND. Позже я собираюсь перенаправить все остальные запросы на сервер WSGI.

В настоящее время это моя конфигурация:

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

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

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

Статическая папка работает отлично, но "/" возвращает 404 НЕ НАЙДЕН. Я также пробовал:

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

В блоке местоположения, но это возвращает 500 ВНУТРЕННЯЯ ОШИБКА СЕРВЕРА. Похоже alias не любит отдельные файлы. Дополнительно я пробовал:

try_files static/index_debug.html;

Но это останавливает запуск сервера с ошибкой «недопустимое количество аргументов в директиве try_files». По-видимому try_files на самом деле требует, чтобы вы попробовали более одного файла, что не является тем поведением, которое я ищу.

Итак, мой вопрос: Как я могу настроить блок местоположения так, чтобы он всегда возвращал статический файл?


РЕДАКТИРОВАТЬ: Я видел из других ответов, что alias действительно должен принимать один файл в качестве аргумента, поэтому я попробовал:

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

Но я все еще получаю только 500 ВНУТРЕННЯЯ ОШИБКА СЕРВЕРА. Журнал ошибок для запроса "/" говорит:

[alert] 28112#0: *7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" is not a directory

Почему он пытается открыть index_debug.htmlindex.html? Я не использую index директива где угодно.

Просто протестировал это, и он работает для меня:

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

Файл /tmp/root/static/index_debug.html есть конечно :)

Я могу нажать любой URL и просто получить статическую страницу.

Вы можете использовать try_files и перенаправление в указанное место с помощью rewrite. Как это:

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

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

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

Если файл существует в /tmp/root он будет обслужен, иначе uri будет переписан на static/index_debug.html и он будет подан.