这两种配置有不同但相关的问题。这两个问题是:
- 位置的顺序是匹配的;和
- 当位置匹配时会发生什么。
我将首先解释它是如何工作的,然后我将解决您的配置问题。
怎么运行的
位置匹配
你可以找到这方面的详细信息Nginx 维基页面 http://wiki.nginx.org/HttpCoreModule#location,但我总觉得措辞很混乱。 (它在行为描述中混合了实现细节。)这意味着位置按以下顺序匹配:
- 完全匹配,例如
location = /robots.txt
- 急切的非正则表达式前缀,例如
location ^~ /trends/
- 正则表达式匹配像
location ~* \.(jpg|png)
,或区分大小写location ~ \.(jpg|png)
- 惰性非正则表达式前缀,例如
location /trends/
or location /
如果多个正则表达式匹配,则第一个匹配将击败其他匹配。如果多个非正则表达式前缀匹配,我认为它会选择最具体的匹配 - 我将检查并更新。
位置行为
匹配位置负责提供指定的内容。它还负责提供缓存控制标头等。您可以有一个与特定 URL 模式匹配的位置来应用特定标头,但该位置还必须提供内容。如果它无法提供内容,您很可能会收到 404 错误 - 它不会查找其他匹配位置。
最后,如果您在某个位置进行重写,请格外小心。内部重定向可能早于某些指令发生,在这种情况下,在重定向导致再次搜索位置之前,这些指令可能不适用。
配置1
您的趋势位置是一个惰性非正则表达式前缀,因此仅当正则表达式位置无法匹配时才会匹配。您可以通过使用急切的非正则表达式匹配来解决此问题,例如
location ^~ /trends {
...
}
然而,这样做会突出其他配置问题。
配置2
您有两个可能与 jpg 文件匹配的位置。只有一个人会成功。如果第一个位置匹配,则不会应用第二个位置的缓存控制。如果第二个匹配,则别名不会生效。
修复方法是确保所需的所有指令都应用于匹配的位置。您可以在一个文件中明确显示,例如
location ^~ /trends
{
alias /var/storage/hottrend;
add_header Cache-control "public";
access_log off;
expires 90d;
}
location ~* ^.+\.(jpeg|gif|png|jpg)
{
add_header Cache-control "public";
access_log off;
expires 90d;
}
管理必须应用于多个位置的指令的更简洁的解决方案是将这些详细信息分解到另一个文件中,然后include
它在两个位置。 (Mohammad AbuShady 在他的例子中就是这样做的。)像这样:
# Inside your main .conf
location ^~ /trends
{
alias /var/storage/hottrend;
include image-headers.conf;
}
location ~* ^.+\.(jpeg|gif|png|jpg)
{
include image-headers.conf;
}
# Inside image-headers.conf
add_header Cache-control "public";
access_log off;
expires 90d;