Назад | Перейти на главную страницу

Вложенное местоположение не работает должным образом

Я не могу отладить эту часть конфигурации nginx:
Я хочу добавить заголовки ко всем запросам на .pdf файл
Затем я хочу удалить токен, который добавляю в свой каталог veiw, чтобы избежать нежелательного кеширования браузера:

location /static {
    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    #Remove Anti cache token
    rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
    ...
}

Синтаксической ошибки nginx нет, но запрашивается .pdf для показывает, что ошибка 404 not found означает, что перезапись не применяется к запросу.

Любая помощь очень ценится
Спасибо

когда nginx выбирает location для обработки запроса он может выбрать внутренний или внешний location блок. Он не объединяет утверждения обоих.

В rewrite не наследуется вложенными location. Если вы хотите rewrite чтобы применить ко всем местоположениям, вы должны поместить его в server область блока.

Регулярное выражение вашего rewrite заявление достаточно конкретное, поэтому его можно перемещать как есть.

Например:

rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;

location /static {
    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    ...
}

Конечно, может быть более эффективным просто повторить rewrite заявление в обоих location блоки.


Альтернативный подход - избежать rewrite все вместе и используйте регулярное выражение location удалить маркер защиты от кеширования с помощью alias директива. Видеть этот документ для большего.

Например:

location ~ "^(?<prefix>/static)[0-9]{10}(?<suffix>/.*)$" {
    alias /path/to/root$prefix$suffix;

    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    ...
}

Обратите внимание, что регулярное выражение location блок имеет другой порядок оценки для префикса location блоки. Видеть этот документ для подробностей.

Хотя лучший ответ на этот вопрос - это то, что я выбрал как лучший, я хочу опубликовать решение, которое я использовал для решения моей проблемы. Для добавления заголовка к некоторым запросам необязательно определять вложенный блок местоположения. Вместо этого я использовал if, чтобы проверить условие регулярного выражения и сделать то, что хочу.
Посмотрите на следующий блок, который я написал, чтобы справиться с этим:

location /static {
    if ( $request_uri ~* \.pdf$ ) {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }

    #Remove Anti cache token
    rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
    ...
}