2009-05-16 6 views
7

Ich kann nicht Nginx zu erreichen, verfalls Kopfzeilen auf meinem statischen Assets in meiner Rails-App.Nginx nicht Einstellung läuft Kopfzeilen auf Rails statische Assets

Meine App wird mithilfe von Phusion Passenger & nginx bereitgestellt.

Im Folgenden finden Sie die entsprechenden Abschnitt meiner nginx Konfigurationsdatei

server { 
     listen 80; 
     server_name my.domain.tld; 
     root /home/deploy/my.domain.tld/current/public; 
     passenger_enabled on; 
     access_log off; 

     location ~* \.(ico|css|js|gif|jp?g|png)\?[0-9]+$ { 
       expires max; 
       break; 
     } 

     if (-f $document_root/system/maintenance.html) { 
       rewrite ^(.*)$ /system/maintenance.html break; 
     } 
} 

Ich bin nicht sicher, warum es nicht Einstellung Header auf meine statische Vermögenswerte (zB /images/foo.png?123456)

abläuft

ich bin mir nicht sicher, ob es etwas mit Passagiere oder wenn meine Lage regexp es ist nicht ansteckend Vielleicht

Antwort

5

Also fand ich die Lösung. Mein Regexp war ein bisschen deprimiert, da ich die Möglichkeit nicht berücksichtigte, dass der Timestamp nicht existierte.

Diese Regexp arbeitete für mich.

location ~* \.(ico|css|js|gif|jp?g|png)(\?[0-9]+)?$ { 
+0

Das ist irreführend.Der Speicherort stimmt nicht mit dem Abfrageparameter überein, sodass in der Realität die Elemente/all/image, css, js in der Liste übereinstimmen, unabhängig vom Cache-Busting-Abfrageparameter. Dies ist für viele Menschen unerwünscht. – raggi

0

genau das zu tun, das wird helfen:

location ~* ^.*\.(ico|css|js|gif|jp?g|png)\?[0-9]+$ { 

Lesen Sie auch how Nginx evaluates location. Sind Sie sicher, dass Sie keine andere Zeichenkette location in Ihrer Konfigurationsdatei haben, die Ihren statischen Ressourcen entspricht, bevor Ihre Regexp location tut?

BTW, verwenden Sie try_files statt if (-f $document_root/...).

+0

nein, dass meine aktuelle Konfigurationsdatei ist:

location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ { access_log off; expires max; add_header Cache-Control public; } 

Sie die volle Konfigurationsdatei auf Github sehen. Es gibt keine anderen Standortrichtlinien. Ich werde versuchen, Ihre Regexp und sehen, ob es die Header setzt. Ich bin mir auch nicht sicher, warum Sie die Verwendung von try_files anstelle der Flag -f empfehlen. Warum/wie ist try_files und Verbesserung in diesem Fall? – cpjolicoeur

+0

Ich bin mir nicht wirklich sicher, aber Igor (der Autor) empfiehlt immer, try_files zu verwenden, wenn Leute nach Neuschreiben auf der Nginx-Mailingliste fragen. Die "if (-f ...)" Direktive kann langsamer geparst werden, aber ich habe noch nie einen Versuch gemacht, das zu versuchen. – Jasiu

10

Ich wollte nur, dass der Zeitstempel eine schlechte Idee, optional zu machen, darauf hinzuweisen ist - wenn es nicht enthalten ist, dann Einstellung expires max falsch ist, da es keine Möglichkeit, die Aktualisierung der Datei wäre.

Auch die location Direktive in Nginx kann die Abfragezeichenfolge nicht sehen, daher entspricht die hier veröffentlichte Lösung niemals dem 'optionalen' Zeitstempel.

Eine richtige Lösung (dh eine, die die maximale sendet erlischt erst, wenn die Datei mit einem Zeitstempel angefordert wurde) wäre:

location ~* \.(js|css|png|jpg)$ { 
    if ($query_string ~ "^[0-9]+$") { 
    expires max; 
    break; 
    } 
} 

Wenn der Zeitstempel nicht angegeben ist, dann setzen Sie auf Last-Modified und ETag, die automatisch von Nginx bearbeitet werden.

+0

Ich habe das 'if' entfernt, da alle von CSS referenzierten Assets nicht den Zeitstempel haben. –

+0

Siehe den ersten Abschnitt meiner Antwort, warum das eine wirklich schlechte Idee ist. Sie sollten Zeitstempel an Ihre Assets anhängen, auf die in Ihrem CSS verwiesen wird. Zum Beispiel: https://github.com/djanowski/collage/blob/master/lib/collage.rb#L135-142 – djanowski

Verwandte Themen