Перейти к содержимому

Директива индекса nginx не работает

1

В следующем фрагменте конфигурации для nginx:

server { listen 443; listen [::]:433;  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  server_name example.com;  root /var/www/example.com; index index.html; error_page 502 = @fallback; error_page 404 = @not_found;  location / { #try_files /index.html $uri =404; # A try_files $uri =404; # B }  location /service/ { rewrite ^/service/(.*)$ /$1 break;  proxy_set_header X-Load-Balancer "a"; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.100:42424; }  location @fallback { try_files /502.html =500; }  location @not_found { try_files /404.html =500; } } 

Почему A правильно обслуживает index.html (который находится в /var/www/example.com/), а B - нет, и в результате вместо этого отображается страница 404.html?

491 просмотр
Riccardo Bestetti спросил 7 лет назад
R 120

1 ответ

1
Принятый ответ

try_filesДиректива обрабатывает каждый член в порядке, пока не найдет файл, который существует.

Если файл /var/www/example.com/index.htmlсуществует, первое слагаемое в случае (A) всегда будет успешным, и URI будет внутренне изменен на /index.html. indexДиректива не участвует. Кроме того, case (A) всегда будет возвращать /index.htmlфайл.

В случае (B) try_filesищет только файлы, а не каталоги. Если вы хотите try_filesсопоставить каталог и обработать его значением indexдирективы, используйте термин с завершающим /. Например:

try_files $uri $uri/ =404; 

Смотрите этот документ для деталей.

Попался! Я помню, что читал, что директива index работает с URI с завершающими слешами, но я не сразу понял, что фактическое обслуживание было реализовано try_files. Это имеет смысл. Спасибо!

Riccardo Bestetti · 7 лет назад · 0

Вам не нужно try_files для реализации index. Но если у вас есть оператор try_files, вам нужно добавить термин$ uri /, иначе index будет отключен в этом блоке.

Richard Smith · 7 лет назад · 0

О хорошо Это указано где-то в документации?

Riccardo Bestetti · 7 лет назад · 0
Richard Smith · 7 лет назад · 0

Я действительно не понимаю, как я мог бы собрать информацию, которую вы предоставили из документации, которую я уже прочитал.

Riccardo Bestetti · 7 лет назад · 0
Richard Smith ответил 7 лет назад
R 488