nginx中的不同位置指令

时间:2013-11-05 11:16:38

标签: php nginx

我是ngnix的新手,我不太了解location指令。我有一个带有folloging配置的网站:

location / {
    rewrite ^(.*)$ /index.php last;
}

#assets

location /web/assets/ {
    rewrite ^(/web/assets/.*)$ $1 break;
}

location /web/assets/cache/ {
    if (!-f $request_filename) {
        rewrite ^/web/assets/cache/(.*)$ /web/assets/cache/index.php last;
    }
}

在网站中,所有请求都被重定向到index.php,但是有一个“资产”文件夹,我不想重定向(/ web / assets /)。在这个文件夹里面有一个名为“cache”的子文件夹。如果请求此子文件夹中的任何文件且该文件不存在,则该请求将重定向到创建该文件并将其保存在缓存中的php文件。这对于预处理的css,js等非常有用,文件是在第一次需要时创建的。

这个配置效果很好,但是我想根据html5 boilderplate建议向资源文件发送一些标题,例如静态内容的过期规则(https://github.com/h5bp/server-configs-nginx/blob/master/conf/expires.conf),当我添加这些指令时:< / p>

location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

# CSS and Javascript
location ~* \.(?:css|js)$ {
  expires 1y;
  access_log off;
  add_header Cache-Control "public";
}

之前的重定向不起作用。我是客人,因为nginx不会执行所有匹配位置,只会执行第一个匹配位置。我的问题是如何在ngnix配置中组合重写和头指令。

1 个答案:

答案 0 :(得分:1)

每个请求只能由一个位置块处理。此外,使用if不是一个好习惯。 try_files可以更有效率。此外,你有一个重写规则,重写为相同的uri(完全没用)。

请允许我将您的conf重写为我认为对您的需求更有效的内容,请告诉我,如果我出错了

#this is just fine as it was
location / {
  rewrite ^(.*)$ /index.php last;
}

#web assets should be served directly
location /web/assets/ {
  try_files $uri $uri/ @mycache;
}

#this is the mycache location, called when assets are not found
location @mycache {
  expires 1y;
  access_log on;
  add_header Cache-Control "public";
  rewrite ^/web/assets/(.*)$ /web/assets/cache/index.php last;
}

#some specific files in the web/assets directory. if this matches, it is preferred over the location web/assets because it is more specific
location ~* /web/assets/.*\.(jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
  try_files $uri $uri/ @mycache;
}

# CSS and Javascript
location ~* /web/assets/.*\.(css|js)$ {
  expires 1y;
  access_log off;
  add_header Cache-Control "public";
  try_files $uri $uri/ @mycache;
}

我可能有拼写错误或错误,我现在没有办法测试。让我知道