我有以下基本Nginx配置(在DigitalOcean Droplet上预安装Ghost平台):
server {
listen 80;
server_name xxx.com;
client_max_body_size 10M;
location / {
proxy_pass http://localhost:2368/;
proxy_set_header Host $host;
proxy_buffering off;
}
}
现在我尝试为我的资产设置以下过期标头,但没有成功:
location ~ ^/assets/ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
}
根据我发现的信息,Nginx一次只使用一个位置路径,因此必须复制资产位置块内的proxy_ *参数。如果我只是复制它们,我会收到一个错误(带有proxy_pass的正则表达式),可以通过在将URL传递给代理之前重写URL来解决。我已经做了一些实验,但我也没有让它工作。
有没有人举例说明当proxy_pass存在时如何设置到期标头?我只是希望xxx.com/assets/下的所有文件都有正确的到期日期。
答案 0 :(得分:2)
使用下面的脚本管理解决它(注意代理后的/ assets /)。
server {
listen 80;
server_name xaviertalpe.be;
client_max_body_size 10M;
location /assets/ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
proxy_pass http://localhost:2368/assets/;
proxy_set_header Host $host;
proxy_buffering off;
}
location / {
proxy_pass http://localhost:2368/;
proxy_set_header Host $host;
proxy_buffering off;
}
}
答案 1 :(得分:2)
location /assets/ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
proxy_pass http://localhost:2368/assets/;
# or proxy_pass http://localhost:2368;
proxy_set_header Host $host;
proxy_buffering off;
}
proxy_pass的Nginx文档说:
如果使用URI指定了proxy_pass指令,那么当请求传递给服务器时,与该位置匹配的规范化请求URI的部分将被指令中指定的URI替换。
我的情况/assets/
被/
(这是一个URI)取代。为避免这种情况,请使用proxy_pass
,其URI等于位置前缀(proxy_pass http://localhost:2368/assets/;
),或者根本不使用URI(proxy_pass http://localhost:2368;
)。但在后一种情况下,nginx将代理非标准化的URI。