【问题标题】:Nginx setting expires header with proxyNginx 设置过期标头与代理
【发布时间】:2014-07-31 15:44:37
【问题描述】:

我有以下基本 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/ 下的所有文件都有正确的到期日期。

【问题讨论】:

  • 你为什么使用正则表达式位置?写location /assets/ {...
  • 例如在查询 xxx.com/assets/css/style.css 时使用 /assets/ 会导致 404。 (请注意,我还复制了此位置块内的代理设置。)我确实注意到查询 /assets/ 将导致 HTTP GET 具有正确的到期日期。编辑:根据 Nginx 日志,对 /assets/css/style.css 的所有请求都被重写为 /css/styles.css。因此是 404。

标签: nginx proxy


【解决方案1】:
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 文档说:

如果 proxy_pass 指令是用 URI 指定的,那么当请求传递到服务器时,与位置匹配的规范化请求 URI 的部分将被指令中指定的 URI 替换。

我的情况 /assets// (这是一个 URI)取代。为避免这种情况,要么使用 URI 等于位置前缀 (proxy_pass http://localhost:2368/assets/;) 的 proxy_pass,要么根本不使用 URI (proxy_pass http://localhost:2368;)。但在后一种情况下,nginx 将代理非规范化的 URI。

【讨论】:

  • 感谢您确认答案。这样我就知道我自己的解决方案(在下面发布)是正确的:)。
【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多