我有大约 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";
}
}
这很糟糕,因为:
- 每个位置块的 proxy_pass 都是重复的
- 这也意味着我无法将其粘贴在外部文件中并将其包含在任何需要它的站点中。
如果我有 2 个站点需要这样做,我似乎别无选择,只能重复整个过程并更改每个位置的 proxy_pass。
有没有办法实现 expires 标头(和 proxy_pass)逻辑的“一次写入多次使用”?
答案1
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/;
}
}
我现在无法测试它,但稍加修改就可以了。