代码之家  ›  专栏  ›  技术社区  ›  JimmyBanks

NGINX只为特定目录和索引文件指定变量

  •  1
  • JimmyBanks  · 技术社区  · 7 年前

    我正在使用fastcgi缓存,并希望指定缓存应该在哪些url上处于活动状态。

    我使用重写规则来确定要访问哪个控制器文件,并动态设置任何查询参数

    我想指定激活缓存的URL,以及缓存处于非活动状态的URL,这是我的代码:

    server {
        listen 80;
        server_name domain.com;
        root /home/site/wwwroot;
    
        set %skip_cache 1;        #this is the variable that I want to set to 0 on specific URLS
    
        location / {
            try_files $uri $uri/ $uri.html @php;
        }
        location @php {         
            rewrite ^(/[^/]+)$ $1.php last;
            rewrite ^(/[^/]+)/(.*)$ $1.php?q=$2 last;
        }
    
    
        location /user/ {
            set $skip_cache 0;
        }
    
        location /objects/ {
            set $skip_cache 0;
        }
    
        location ~ \.php$  {
            try_files $uri =404;
            include fastcgi_params;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            fastcgi_split_path_info ^(.+?\.php)(/.*)?$;
            fastcgi_connect_timeout         300; 
            ...etc...
    
        #cache parameters
        fastcgi_param FASTCGI_CACHE 1;
        fastcgi_cache cfcache;
        fastcgi_cache_valid 30s;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        add_header X-FastCGI-Cache $upstream_cache_status;  
    }
    

    如您所见,默认情况下变量$skip_cache设置为1,我想列出用于缓存的url。

    我想要缓存的一个例子是 domain.com , domain.com/user/123 domain.com/objects/456

    目前,如果我浏览到 /user/123 ,结果是 404 错误,因为我认为具有变量设置的位置块正在被独占使用。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Richard Smith    7 年前

    如果要基于原始请求设置变量,应使用 map 指令与 $request_uri 变量。见 this document 详细情况。

    例如:

    map $request_uri $skip_cache {
        default      1;
        ~^/user/     0;
        ~^/objects/  0;
    }
    server {
        ...
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        ...
    }