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

375
Riccardo Bestetti

В следующем фрагменте конфигурации для 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?

1

1 ответ на вопрос

1
Richard Smith

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 6 лет назад 0
Вам не нужно `try_files` для реализации` index`. Но если у вас есть оператор `try_files`, вам нужно добавить термин` $ uri / `, иначе` index` будет отключен в этом блоке. Richard Smith 6 лет назад 0
О хорошо Это указано где-то в документации? Riccardo Bestetti 6 лет назад 0
Индекс [задокументирован здесь] (http://nginx.org/en/docs/http/ngx_http_index_module.html#index). Richard Smith 6 лет назад 0
Я действительно не понимаю, как я мог бы собрать информацию, которую вы предоставили из документации, которую я уже прочитал. Riccardo Bestetti 6 лет назад 0