Hinzufügen von Cache-Control zu Nginx für Bilder, CSS, JS und Schriftarten

7

Ich versuche, Cache-Control auf Nginx für Assets auf meinem Server zum Laufen zu bringen, und es läuft nicht wie erwartet. Hier ist meine Serverkonfiguration für Nginx.

Alles außer Cache-Control funktioniert.

Serverblöcke

server {
   listen 80;
   server_name www.example.com;
   rewrite ^ https://$server_name$request_uri? permanent;
}

server {
   listen 80;
   server_name example.com;
   rewrite ^ https://www.$server_name$request_uri? permanent;
}

server {
   listen 443 ssl;
   server_name default;
   root /app/public;

   ssl_certificate /etc/nginx/ssl/default/crt/server.crt;
   ssl_certificate_key /etc/nginx/ssl/default/crt/server.key;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   index index.html index.htm index.php;
   charset utf-8;
   add_header "X-UA-Compatible" "IE=Edge,chrome=1";

   location ~* \.(ico|css|js|gif|jpeg|jpg|png|woff|ttf|otf|svg|woff2|eot)$ {
       expires 1d;
       access_log off;
       add_header Pragma public;
       add_header Cache-Control "public, max-age=86400";
       add_header X-Asset "yes";
   }

   location / {
      try_files $uri $uri/ /index.php?$query_string;
   }

   location = /favicon.ico { access_log off; log_not_found off; }
   location = /robots.txt { access_log off; log_not_found off; }
   access_log off;
   error_log /var/log/nginx/default-error.log error;

   error_page 404 /index.php;
   location ~ \.php$ {
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
      fastcgi_index index.php;
      include fastcgi_params;
   }

   location ~ /\.ht {
      deny all;
   }
}

Hier ist die Antwort meines Servers für https://www.example.com/icons/facebook.png:

Accept-Ranges:bytes
Cache-Control:public, max-age=120
Connection:keep-alive
Content-Length:416
Content-Type:image/png
Date:Tue, 04 Oct 2016 14:46:26 GMT
ETag:"57f2a0fd-1a0"
Last-Modified:Mon, 03 Oct 2016 18:18:37 GMT
Server:nginx/1.11.2

Das maximale Alter ist dort, 120wo ich es erwarte 86400und es gibt auch keinen benutzerdefinierten X-AssetHeader.

HTTP-Block

Der /etc/nginx/conf.d/Ordner ist leer.

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    # gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
Kevin
quelle
Brauchen Sie wirklich "add_header Pragma public"? ? Es wurde nie richtig benutzt und ist seitdem veraltet
pcarvalho

Antworten:

2

Sendet Ihre Herkunft einen Cache-ControlHeader zurück? Oder ist dies eine der Dateien, die direkt vom Dateisystem bereitgestellt werden.

Wenn ja, haben Sie Nginx nach der Änderung möglicherweise nicht neu geladen? sudo nginx -s reload

Trennen Sie sich von Ihrer direkten Frage, aber beachten Sie nur, dass die Zeile:

add_header "X-UA-Compatible" "IE=Edge,chrome=1";

gilt nicht für Speicherorte, die eine eigene add_headerDirektive enthalten (dies können Sie in Ihrer eingefügten Ausgabe sehen).

Joshua DeWald
quelle
Ich habe Nginx neu gestartet. Sollte ich die Konfiguration neu laden oder macht ein Neustart dasselbe?
Kevin
Die Datei facebook.png wird wie erwartet vom Server zurückgegeben und lädt einfach nicht den richtigen Cache-Control-Header.
Kevin
Ich habe gerade einen benutzerdefinierten Header hinzugefügt, der auch nicht angezeigt wird. Ich frage mich, ob mein Standort-Regex schlecht ist, aber ich sehe ihn nicht.
Kevin
Nun, die Frage ist, ob der Cache-ControlHeader vom ursprünglichen Server (von fastcgi) zurückkommt oder so. Wenn Sie überschreiben möchten, müssen Sie es vor der ursprünglichen Antwort verbergen, um es erneut hinzufügen zu können.
Joshua DeWald
Was meinst du mit "Original Server"? Nginx, Assets und Anwendungscode befinden sich alle auf demselben Server. Aus Gründen der Klarheit ist es mein Hauptziel, dass die Browser-Assets nicht Nginx zwischenspeichern. Ich verwende Nginx nicht als Proxy für das Caching. Wollen Sie damit sagen, dass das fastcgi-Gateway möglicherweise Header hinzufügt und zu Nginx zurückschleift? Ich habe alle anderen Konfigurationen durchgesehen und Cache-ControlNginx setzt keine Header.
Kevin