Директива местоположения nginx сначала не ищет указанный файл

У меня есть простой файл конфигурации nginx -

server {
    listen 80 default_server;

    root /var/www/example.com;

    #
    # Routing
    #

    location / { index index.html; }
    location /foo { index foo.html }

    #
    # Logging
    #

    access_log /var/log/nginx/{{ www_domain }}.log;
    error_log  /var/log/nginx/{{ www_domain }}-error.log error;

    server_name example.com;
    charset utf-8;
}

Как видите, всего 2 маршрута - путь / и /foo.

  • Когда захожу на www.example.com/, все работает правильно. Я вижу обслуживаемую index.html страницу.

  • Когда я перехожу к www.example.com/foo, я получаю сообщение об ошибке 404, когда я должен получить страницу foo.html.

Глядя в логи, вижу такую ​​ошибку:

2018/08/13 21:51:42 [error] 14594#14594: *6 open() "/var/www/example.com/foo" failed (2: No such file or directory), client: XX.XX.XX.XX, server: example.com, request: "GET /foo HTTP/1.1", host: "example.com"

Ошибка означает, что он ищет файл с именем /var/www/example.com/foo, а не /var/www/example.com/foo.html, как я ожидал.

Почему это вообще происходит и почему этого не происходит на моем корневом пути /?

Спасибо!

Изменить: это работает, если я посещаю www.example.com/foo.html напрямую


person user2490003    schedule 13.08.2018    source источник


Ответы (1)


Директива index добавит имя файла, когда вы укажете URI каталога.

Таким образом, / указывает на корневой каталог (/var/www/example.com/), а оператор index index.html; заставляет nginx вернуть файл /var/www/example.com/index.html.

/foo URI не указывает на каталог. Если каталог /var/www/example.com/foo/) действительно существует, оператор index foo.html; заставит nginx вернуть файл /var/www/example.com/foo/foo.html. Что не /var/www/example.com/foo.html.

То, что вы пытаетесь достичь, - это некая схема без расширений, которая не имеет ничего общего с директивой index.

Подробную информацию о директиве index см. В этом документе.


Есть много решений, которые будут работать, например, с использованием try_files вместо index:

location /foo { try_files /foo.html =404; }

Дополнительные сведения см. В этом документе.

person Richard Smith    schedule 14.08.2018
comment
Спасибо! В этом есть смысл - похоже, у меня было фундаментальное непонимание того, как работает директива index. - person user2490003; 14.08.2018