1 votes

nginx ne met pas en cache les images lorsqu'elles sont lues dans des fichiers php.

J'ai un fichier .php qui charge les images pour cacher leur emplacement. Toutes les images sont correctement mises en cache par cette directive :

location ^~ \.(jpg|jpeg|png|gif|ico|css|js)$ {
            expires max;
            valid_referers server_names blocked mysiteaddresishere;
            if ($invalid_referer) {
               return   403;
            }
}

Au fait, les référents valides ne fonctionnent pas, je ne sais pas pourquoi.

J'ai ajouté ^ avant ~, quelqu'un a dit que cela devrait regarder la plus longue regex, peut-être que c'est le cas mais pas avec les fichiers php.

J'ai dans mon serveur virtuel quelque chose comme ceci :

location ~ \.php$ {
    try_files /a30bc49b5ff24bc50d55ba4306d73470.htm @php;
}

location @php {
    try_files $uri =404;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass 127.0.0.1:9010;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_intercept_errors on;
}

Je ne sais pas si cela bloque la mise en cache de mon lecteur d'images php, mais je n'arrive pas à trouver comment ajouter des images dans ces expirations.

J'ai trouvé ce site : fr.dklab.ru /lib/HTTP_ImageResizer/, et j'ai essayé comme ceci :

location /imagehi.php {
        fastcgi_cache MYAPP;
        fastcgi_cache_valid 200 304 404 240h;
        fastcgi_cache_key "method=$request_method|ims=$http_if_modified_since|inm=$http_if_none_match|host=$host|uri=$request_uri";
        fastcgi_hide_header "Set-Cookie";
        fastcgi_ignore_headers "Cache-Control" "Expires";

    # or use proxy_* commands if you use Apache, not FastCGI PHP
}

Mais ça ne marche toujours pas. Avez-vous une idée de ce qui m'échappe ?

Configuration de Nginx

fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    listen *:80;

    server_name mysite.com www.mysite.com;

    root   /var/www/mysite.com/web;

    index index.html index.htm index.php index.cgi index.pl index.xhtml;

    error_page 400 /error/400.html;
    error_page 401 /error/401.html;
    error_page 403 /error/403.html;
    error_page 404 /error/404.html;
    error_page 405 /error/405.html;
    error_page 500 /error/500.html;
    error_page 502 /error/502.html;
    error_page 503 /error/503.html;
    recursive_error_pages on;
    location = /error/400.html {

        internal;
    }
    location = /error/401.html {

        internal;
    }
    location = /error/403.html {

        internal;
    }
    location = /error/404.html {

        internal;
        }
    location = /error/405.html {

        internal;
    }
    location = /error/500.html {

        internal;
    }
    location = /error/502.html {

        internal;
    }
    location = /error/503.html {

        internal;
    }

    error_log /var/log/ispconfig/httpd/mysite.com/error.log;
    access_log /var/log/ispconfig/httpd/mysite.com/access.log combined;

    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location /stats {

        index index.html index.php;
        auth_basic "Members Only";
        auth_basic_user_file /var/www/clients/client0/web1/web/stats/.htpasswd_stats;
    }

    location ^~ /awstats-icon {
        alias /usr/share/awstats/icon;
    }

    location ~ \.php$ {
        try_files /a30bc49b5ff24bc50d55ba4306d73470.htm @php;
    }

    location @php {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9010;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
    }

    location /imagehi\.php\?=.+\.(jpg|jpeg|png|gif) {
        fastcgi_cache MYAPP;
        fastcgi_cache_valid 200 60m;
        # or use proxy_* commands if you use Apache, not FastCGI PHP
    }

    location /imagehi.php\?=([A-Z]|[0-9]|[a-z]|&)+\.(jpg|jpeg|png|gif)$ {
                 expires max;
    }
    location ~ (imagehi\.php\?=.+\.(jpg|jpeg|png|gif))${ {
                 expires max;
    }
    location ^~ \.(jpg|jpeg|png|gif|ico|css|js)$ {
                 expires max;
    }

0voto

masegaloeh Points 17760

Convertir la question auto-répondue en CW

Je l'ai résolu dans le fichier php image.php pas dans nginx. La solution était dans les en-têtes, j'ai juste suivi ceci pages de blog

// Return the requested graphic file to the browser
// or a 304 code to use the cached browser copy
function displayGraphicFile ($graphicFileName, $fileType='jpeg') {
    $fileModTime = filemtime($graphicFileName);
    // Getting headers sent by the client.
    $headers = getRequestHeaders();
    // Checking if the client is validating his cache and if it is current.
    if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $fileModTime)) {

        // Client's cache IS current, so we just respond '304 Not Modified'.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fileModTime).' GMT', true, 304);
    } else {
        // Image not cached or cache outdated, we respond '200 OK' and output the image.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fileModTime).' GMT', true, 200);
        header('Content-type: image/'.$fileType);
        header('Content-transfer-encoding: binary');
        header('Content-length: '.filesize($graphicFileName));
        readfile($graphicFileName);
    }
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X