Nginx 配置 - 在某些路径上缓存标头

Nginx 配置 - 在某些路径上缓存标头

根据我对 nginx 文档的理解,位置不能嵌套(或者更确切地说,如果它们的效果不可继承)并且proxy_pass不能属于该server {}级别。所以我现在的配置是这样的,我知道我可以通过使用文件路径来缓解一些问题,但是让我们假设我在使用proxy_pass.想必有一种更好的方法可以在不重复的情况下编写此内容:

server {
  listen  80;
  server_name salessystem.acmecorp.com;

  location /extjs/ {
    ## proxy_buffers 128 256k;
    proxy_pass http://localhost:5400/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    add_header 'X-UA-Compatible' 'IE=Edge;chrome=1';
    expires max;
    gzip  on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 7;
    gzip_proxied any;
    gzip_types text/html text/css text/pdf application/json application/x-javascript text/javascript;
    access_log off;
    break;
  }

  location / {
    ## proxy_buffers 128 256k;
    proxy_pass http://localhost:5400/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    add_header 'X-UA-Compatible' 'IE=Edge;chrome=1';
    expires epoch;
    gzip  on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 7;
    gzip_proxied any;
    gzip_types text/html text/css text/pdf application/json application/x-javascript text/javascript;
    access_log off;
    break;
  }
}

답변1

我认为您的 nginx 配置如下:

  • 因为这只是两个不同位置的过期标头不同,尽管两者都将代理匹配到同一服务器。
  • 尝试将两个位置放在一个块中
  • 根据查询字符串(或位置匹配字符串)设置不同的过期标头

标签。

server {
  listen  80;
  server_name salessystem.acmecorp.com;

  location ~* (/extjs/|/) {
    ## proxy_buffers 128 256k;
    proxy_pass http://localhost:5400/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    add_header 'X-UA-Compatible' 'IE=Edge;chrome=1';
    expires max;
      if ($query_string ~ \/extjs\/) {
      expires epoch;
      }
    gzip  on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 7;
    gzip_proxied any;
    gzip_types text/html text/css text/pdf application/json application/x-javascript text/javascript;
    access_log off;
    break;
  }

}

但是,请根据您的需要进行测试,尤其是在正则表达式匹配locationquery_string值匹配附近。

然而,尚不清楚为什么您希望 extjs从代理服务器(似乎是动态应用程序服务器)中获得服务,因为如果我的假设是正确的,它们只是纯文本文件。相关请求extjs不需要通过代理或应用程序逻辑系统,以防万一它们可以通过文件系统独立提供服务。我考虑将其保留在其单独的位置本身,并在其自己的位置块中拥有独特的 gzip/expires 指令,而其他常见指令可以保存在服务器块本身中。

例如:

server {
   ...
   common gzip directives
   common header setters
   common expires setters
   ...
   location / {
     proxy to backend app server
     settings unique to / location
     ..
   }
   location /extjs {
     settings unique to /extjs location
     expires header reset
     ...
   }
}

관련 정보