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 шт):
Кажется я понял в чём проблема. У вас в блоке location не указана директива index. Эта директива указывает файл, который должен отправляться при запросах, оканчивающихся на /. На вашем скрине я вижу, что путь именно /.
Nginx работает по такой логике: запрос оканчивается на /?
Да - показать файл указанный в директиве index, если это не получилось, вернуть приветственную страницу
Нет - вернуть файл указанный в конце пути, если его нет, то вернуть приветственную страницу
Если вы сейчас сделаете запрос по пути /index.html, то у вас всё заработает. Чтобы в конце не приходилось писать index.html добавьте директиву index
Хех, кинул ссылку на документацию про 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;
}
}
Мне кажется, что вам сильно усложняет жизнь location = / .
Я бы составил конфиг так:
server {
listen 80;
server_name example.ru;
location / {
root /var/www/test;
}
location /api/ {
proxy_pass ...;
}
}
