nginx – 如何获得服务器inheritance/添加caching头到各种反向代理网站

我有大约5个站点通过反向代理在不同的端口上运行,并可以在不同的子域下访问。 其中一些网站自行设置过期时间(/ cache-control max age header),不需要pipe理,但有些则不需要。

对于那些我没有,我想指定过期的静态内容(按照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个站点需要这个,我似乎别无select,只能复制整个事情改变每个位置的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/; } } 

我现在无法testing,但稍加修改就可以工作。