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

nginx: несколько совпадающих блоков местоположения

Я пытаюсь установить директиву заголовка max-age и «вложение» Content-Disposition следующим образом:

location / {

    # set up max-age header directive for certain file types for proper caching
    location ~* \.(?:css|js|ico|gif|jpe?g|png|mp3|mpeg|wav|x-ms-wmv|eot|svg|ttf|woff|woff2)$ {
        expires 7d;
        add_header Cache-Control "public";
    }

    # force download for ceratain file types
    location ~* \.(?:fb2|mobi|mp3)$ {
         add_header Content-Disposition "attachment";
    }
...
}

Проблема заключается в том, что файлы .mp3 соответствуют обоим блокам местоположения. Используется только первый (max-age). Как я могу иметь .mp3 с обоими - max-age и Content-Disposition "вложение"?

Есть хорошая статья о соответствие сервера и блока местоположения здесь. Может совпадать только один блок местоположения, поэтому вы собираетесь создать блок местоположения только для файлов mp3.

 location ~*  \.mp3$ {
   expires 7d;
   add_header Cache-Control "public";
   add_header Content-Disposition "attachment";
}

Nginx будет соответствовать первому блоку местоположения с тем же префиксом, поэтому он должен быть перед двумя существующими блоками, или вам нужно удалить mp3 из критериев соответствия для двух других блоков.

Учитывая, что используется только первое местоположение, почему бы просто не сделать это ?:

location / {

    # set up max-age header directive for certain file types for proper caching
    location ~* \.(?:css|js|ico|gif|jpe?g|png|mpeg|wav|x-ms-wmv|eot|svg|ttf|woff|woff2)$ {
        expires 7d;
        add_header Cache-Control "public";
    }

    # force download for ceratain file types
    location ~* \.(?:fb2|mobi)$ {
         add_header Content-Disposition "attachment";
    }

    # For mp3 files set both:
    location ~* \.mp3$ {
        expires 7d;
        add_header Cache-Control "public";
        add_header Content-Disposition "attachment";
    }

...
}