由於 PHP 應用程式的標頭衝突,FastCGI 快取“MISS”?

由於 PHP 應用程式的標頭衝突,FastCGI 快取“MISS”?

我已經像這樣設定了 FastCGI 快取:

location ~ \.php(/.*)?$ {
    fastcgi_cache RWI;
    fastcgi_cache_valid 200 60m;

    set $nocache 0;
    if ($request_method = POST)
    {
        set $nocache 1;
    }

    if ($http_cookie ~ (rwi_userid*|rwi_password*)) {
        set $nocache 1;
    }

    if ($request_uri ~* "/(vb/admincp/)") {
        set $nocache 1;
    }

    fastcgi_no_cache $nocache;
    fastcgi_cache_bypass $nocache;

    fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass "unix:/var/www/vhosts/system/{domain}/php-fpm.sock";
    include /etc/nginx/fastcgi.conf;
}

在塊的頂部server{}我有:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=RWI:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;

問題是我的 PHP 腳本(vBulletin)總是會發送 Pragma & Cache-Control private。當上述規則不適用時,有什麼方法可以忽略這些標頭並強制 FastCGI 使用快取嗎?我有點迷失在這種快取可能性中。

答案1

Nginx 在用作反向代理時會解釋一堆標頭,以遵守 HTTP 中間快取規格。這意味著以下標頭(如果您的應用程式回復中存在)將更改快取行為,如下所述:

  • 「X-Accel-Expires」頭字段設定回應的快取時間(以秒為單位)。零值會禁用回應的快取。如果該值以@前綴開頭,則它會設定自紀元以來的絕對時間(以秒為單位),在此時間之前可以快取回應。

  • 如果頭部不包含「X-Accel-Expires」字段,則可以在頭部字段「Expires」或「Cache-Control」中設定快取的參數。

  • 如果標頭包含「Set-Cookie」字段,則不會快取此類回應。

  • 如果標頭包含具有特殊值「*」的「Vary」字段,則不會快取此類回應(1.7.7)。如果標頭包含具有其他值的「Vary」字段,則將考慮相應的請求標頭字段(1.7.7)來快取此類回應。

然而,nginx 附帶了fastcgi_ignore_headers如果您想關閉此指令。所以您正在尋找的是:fastcgi_ignore_headers Cache-Control Pragma;

相關內容