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

12

В моем приложении я хочу, чтобы местоположение "/" возвращало статический файл index.html, я хочу, чтобы "/ static" обслуживал статические файлы из папки, и я хочу, чтобы все другие запросы возвращали 404 НЕ НАЙДЕНО. Позже я собираюсь перенаправить все остальные запросы на сервер 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" не является каталогом

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

Hubro
источник
Можете ли выtry_files static/index_debug.html static/index_debug.html;
ceejayoz
@ceejayoz: пробуя ваше предложение, location =/я получаю 404 НЕ НАЙДЕН, а location /я получаю ОШИБКУ ВНУТРЕННЕГО СЕРВЕРА 500.
Hubro
Если я не ошибаюсь, вы упускаете директиву Index ... Любой веб-сервер всегда будет искать индексный файл, предоставляя корневой URI (/), я думаю, вы можете переопределить это, добавив:location / { return 404; }
Martino Dino
@MartinoDino: зачем мне это? И где?
Hubro
location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Мартино Дино

Ответы:

10

Только что проверил это и у меня работает:

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, и я просто получаю статическую страницу.

chrskly
источник
0

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

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и будет обслужен.

Кирилл Зайцев
источник