Adding expires on all images break nginx rewrite


I host a website based on Laravel with Nginx 1.6.2 + PHP-FPM 5.6. Most
images on the website are in /static folder and are served to visitors
a PHP file (see /static location).

I want to add a 30 days expire on all images of this vhost. However,
when I
add the “location ~* .(?:image)$ {” rule to add expire, the rewrite for
images in /static doesn’t work anymore. Nginx reports file not found for
all images in /static.

Any idea how to make it works?

Vhost configuration below:

server {
listen 80;
root /home/www/;
access_log /var/log/nginx/;
error_log /var/log/nginx/ warn;

    location /static {
            rewrite ^/static/images/([0-9])\-([0-9]+)x([0-9]+)/(.*)$


not working, break the rewrite images above

location ~*

.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|woff)$ {

expires 30d;

add_header Cache-Control “public”;


    include conf.d/custom/restrictions.conf;
    include conf.d/custom/pagespeed.conf;
    include conf.d/custom/fpm-laravel.conf;

    pagespeed DisableFilters combine_css;


Rewrite not working after adding the location for all images expire:

2015/03/17 13:46:12 [error] 11792#0: *12217 openat() “/home/www/
failed (2: No such file or directory)



That’s because the latter regex location takes precedence over the
You should first decide if that regex location should also includes
prefix or not.
If it’s a yes, then you should also add the same rewrite-rule inside
regex location, if it’s a not, you can turn your /static location to
use regex like this

location ~ ^/static/ {

rewrite here…


So nginx will take a look at that location first when you request for
/static/* urls.

Another way is to use try_files, but then you should probably create
another (internal) location block to do the rewrite.

On Wed, Mar 18, 2015 at 2:49 AM, Karl J. [email protected]