如何让nginxcaching重写资产?

我使用的是cakephp1.3,一些资产是主题资产(js,img等),其他资产不是主题资产。

非主题资产正确caching; 但主题资产没有得到正确的到期头。 我在位置块中使用重写来帮助查找主题资产,但由于某种原因,nginx并没有应用正确的caching头。

我附上了我的nginxconfiguration下面的副本。 有没有人解决了如何caching重写的资产?

user nginx; worker_processes 2; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } #----------------------------------------------------------------------------------------------------- http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80; server_name ag_production; access_log /var/log/nginx/ag.access.log; error_log /var/log/nginx/ag.error.log; rewrite_log on; root /var/www/html/app/webroot/; index index.php index.html index.htm; set $no_cache 0; location / { try_files $uri $uri/ @rules; } location @rules { rewrite ^(.+)$ /index.php?url=$1 last; } # Pass the PHP scripts to FastCGI server # listening on 127.0.0.1:9000 location ~ \.php$ { #try_files $uri =404; fastcgi_cache my_cache; fastcgi_cache_valid 200 60m; # Only cache 200 responses, cache for 60 minutes fastcgi_cache_methods GET HEAD; # Only GET and HEAD methods apply add_header X-Fastcgi-Cache $upstream_cache_status; fastcgi_cache_bypass $no_cache; # Don't pull from cache based on $no_cache fastcgi_no_cache $no_cache; # Don't save to cache based on $no_cache fastcgi_buffer_size 128k; fastcgi_buffers 256 4k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; # fastcgi_pass unix:/tmp/php-fastcgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_intercept_errors on; # to support 404s for PHP files not found fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~* \.(?:manifest|appcache|html?|xml|json)$ { try_files $uri $uri/ @rules; expires -1; access_log logs/static.log; # I don't usually include a static log } # Feed location ~* \.(?:rss|atom)$ { try_files $uri $uri/ @rules; expires 1h; add_header Pragma "public"; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; } # Media: images, icons, video, audio, HTC location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ { expires 1M; access_log off; add_header Pragma "public"; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; try_files $uri $uri/ @rules; } # CSS and Javascript location ~* \.(?:css|js)$ { try_files $uri $uri/ @rules; expires 1y; access_log off; add_header Pragma "public"; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; } # Deny access to .htaccess files, # git & svn repositories, etc location ~ /(\.ht|\.git|\.svn) { deny all; } } } 

是的,CakePHP的主题资产比较慢,在官方文档中也有描述。

解决方案是通过使用try_files通过nginx提供这些主题资产。

下面是一个用于上述目的的nginx配置示例:

 # Serve CakePHP plugin assets directly location ~ /(.+)/(img|css|js|files)/(.*) { access_log off; expires 10d; add_header Cache-Control public; try_files $uri $uri/ /../plugins/$1/webroot/$2/$3 /../../plugins/$1/webroot/$2/$3 /index.php?url=$uri; } 

( 来源 )