У меня около 5 сайтов, работающих на разных портах через обратный прокси-сервер и доступных в разных поддоменах. Некоторые из этих сайтов сами устанавливают срок действия (заголовок / cache-control max age) и не требуют управления этим, однако некоторые этого не делают.
Для тех, которых я не делаю, я хочу указать срок действия статического содержимого (согласно https://github.com/h5bp/server-configs/blob/master/nginx.conf), однако я не могу найти способ сделать это без дублирования этой логики на каждом сервере. Я знаю, что для одного сервера я могу сделать это так:
server {
listen 80;
server_name sub.domain.com;
location \ {
proxy_pass http://localhost:1234/;
}
# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html|xml|json)$ {
proxy_pass http://localhost:1234/;
expires -1;
access_log logs/static.log;
}
# Feed
location ~* \.(?:rss|atom)$ {
proxy_pass http://localhost:1234/;
expires 1h;
add_header Cache-Control "public";
}
# Favicon
location ~* \.ico$ {
proxy_pass http://localhost:1234/;
expires 1w;
access_log off;
add_header Cache-Control "public";
}
# Media: images, video, audio, HTC, WebFonts
location ~* \.(?:jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm)$ {
proxy_pass http://localhost:1234/;
expires 1M;
access_log off;
add_header Cache-Control "public";
}
# CSS and Javascript
location ~* \.(?:css|js)$ {
proxy_pass http://localhost:1234/;
expires 1Y;
access_log off;
add_header Cache-Control "public";
}
}
Это отстой, потому что:
Если у меня есть 2 сайта, которые требуют этого, у меня, кажется, нет другого выбора, кроме как дублировать все это, меняя proxy_pass для каждого местоположения.
Есть ли способ добиться «напиши один раз, используй много» для логики истечения срока действия заголовка (и proxy_pass)?
nginx может выполнять включение, с include path-to-file;
разметка.
Вы также можете использовать if
вместо определения местоположения этого случая, поэтому я бы попробовал что-то вроде этого:
server {
listen 80;
server_name sub.domain.com;
location / {
if ( $uri ~* \.(?:manifest|appcache|html|xml|json)$ ) {
expires -1;
access_log logs/static.log;
}
if ( $uri ~* \.(?:rss|atom|ico|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm|css|js) ) {
add_header Cache-Control "public";
}
if ( $uri ~* \.(?:ico|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm|css|js) ) {
access_log off;
}
if ( $uri ~* \.(?:rss|atom) ) {
expires 1h;
}
if ( $uri ~* \.(?:ico) ) {
expires 1w;
}
if ( $uri ~* \.(?:jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm) ) {
expires 1M;
}
if ( $uri ~* \.(?:css|js) ) {
expires 1Y;
}
try_files @proxy;
}
location @proxy {
proxy_pass http://localhost:1234/;
}
}
Я не могу сейчас проверить это, но с небольшими изменениями это должно работать.