location = / не работает

Хочу прописать особые параметры для главной страницы.

В документации написано:

location = / { [ конфигурация А ] }

Для запроса “/” будет выбрана конфигурация А

Вот я и пишу у себя:

$ cat /etc/nginx/sites-enabled/test.conf
server {
  listen 80;

  server_name example.ru;

  location = / {
    root /var/www/test;
    expires 0;
  }
}

$ sudo systemctl restart nginx

Все файлы есть и права доступа правильные:

$ ls -alh /var/www/test
итого 12K
drwxr-xr-x  2 root root     4,0K авг 24 18:45 .
drwxr-xr-x  9 root www-data 4,0K авг 24 18:45 ..
-rw-r--r--  1 root root       19 авг 24 18:45 index.html

$ cat /var/www/test/index.html
<h1>It works!</h1>

Но в браузере я вижу стандартную страницу nginx.

Кэш естественно почищен, и даже режим инкогнито попробован.

Почему?

введите сюда описание изображения


Ответы (3 шт):

Автор решения: Inventor

Кажется я понял в чём проблема. У вас в блоке location не указана директива index. Эта директива указывает файл, который должен отправляться при запросах, оканчивающихся на /. На вашем скрине я вижу, что путь именно /.

Nginx работает по такой логике: запрос оканчивается на /?

Да - показать файл указанный в директиве index, если это не получилось, вернуть приветственную страницу

Нет - вернуть файл указанный в конце пути, если его нет, то вернуть приветственную страницу

Если вы сейчас сделаете запрос по пути /index.html, то у вас всё заработает. Чтобы в конце не приходилось писать index.html добавьте директиву index

→ Ссылка
Автор решения: andreymal

Хех, кинул ссылку на документацию про index и там же нашёл причину проблемы:

Необходимо иметь в виду, что при использовании индексного файла делается внутреннее перенаправление и запрос может быть обработан уже в другом location’е.

И так как по умолчанию прописывается index index.html;, то запрос, пришедший в location = /, уходит в /index.html, для которого я настройки не написал.

Так что нужно их написать:

server {
  listen 80;

  server_name example.ru;

  # На самом деле этот location вообще не нужен,
  # если используются настройки по умолчанию
  location = / {
    root /var/www/test;
    # index index.html; прописывается по умолчанию
  }

  # А вот этот location как раз очень нужен
  location = /index.html {
    root /var/www/test;
    expires 0;
  }
}
→ Ссылка
Автор решения: nörbörnën

Мне кажется, что вам сильно усложняет жизнь location = / .

Я бы составил конфиг так:

server {
  listen 80;
  server_name example.ru;

  location / {
    root /var/www/test;
  }
  location /api/ {
    proxy_pass ...;
  }
}
→ Ссылка