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?

1 ответ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;

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .