我是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配置中组合重写和头指令。
答案 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;
}
我可能有拼写错误或错误,我现在没有办法测试。让我知道