Configurazione di Nginx per Sylius

Recentemente abbiamo iniziato a utilizzare la sempre più popolare piattaforma Sylius per uno dei nostri progetti di e-commerce. Sylius è basato su Symfony2, il principale framework PHP con cui abbiamo lavorato sul nostro sito web di fotografia . Anche se utilizziamo WooCommerce per progetti più piccoli, Sylius fornisce una soluzione più moderna e potente che riteniamo sia decisamente più adatta per siti di e-commerce più ambiziosi.

Un problema con cui inizialmente abbiamo lottato è stato far funzionare correttamente Sylius sul nostro server web Nginx + PHP-FPM + Ubuntu 14.04. Abbiamo iniziato con unfile di configurazione standard di Symfony2 più alcune ottimizzazioni, ma non siamo riusciti a far funzionare le miniature dei prodotti. Risulta che LiipImagineBundle viene utilizzato per generare miniature al volo e questo interferiva con il nostro set di regole di scadenza della cache, risultando in 404 per tutte le miniature delle immagini che abbiamo provato a visualizzare.

Ecco cosa stavamo utilizzando in modo errato per impostare una data di scadenza di 1 anno nel futuro per i file statici:

location ~ \.(js|css|png|jpeg|jpg|gif|ico|swf|flv|pdf|zip)$ { # Set expiry date to 1 year in the future. expires 365d ; }
Linguaggio codice: Nginx ( nginx )

Anche se normalmente funziona senza problemi, significa anche che qualsiasi URL che termina con una di queste estensioni aggirerà completamente il file app.php, indipendentemente dal fatto che il file immagine effettivo esista o meno. Poiché le miniature in Sylius vengono create al volo su una richiesta URL, ciò interrompe completamente la creazione delle miniature.

La soluzione è molto semplice: impostiamo solo la data di scadenza per i file richiesti che esistono effettivamente. Altrimenti, li riscriviamo nel file app.php, come al solito. Ecco il file di configurazione di Nginx finale che abbiamo usato:

server { server_name example.com; root /var/www/example.com/web; location / { try_files $uri @rewriteapp ; # Redirect to app.php if the requested file does not exist. } # Development rule-set. # This rule should only be placed on your development environment. # In production, don't include this and don't deploy app_dev.php or config.php. location ~ ^/(app_dev|config)\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$ ; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ; fastcgi_param HTTPS off ; } # Production rule-set. location ~ ^/app\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$ ; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ; fastcgi_param HTTPS off ; # Prevents URIs that include the front controller. This will 404: # http://domain.tld/app.php/some-path # Remove the internal directive to allow URIs like this. internal; } # Static files rule-set. location ~ \.(js|css|png|jpeg|jpg|gif|ico|swf|flv|pdf|zip)$ { # Set rules only if the file actually exists. if (-f $request_filename ) { # Set expiry date to 1 year in the future. expires 365d ; # Further optimize by not logging access to these files. access_log off ; } # Rewrite to app.php if the requested file does not exist. try_files $uri @rewriteapp ; } # Rewrite rule for PHP files. location @rewriteapp { rewrite ^(.*)$ /app.php/ $1 last ; } error_log /var/log/nginx/example.com_error.log; access_log /var/log/nginx/example.com_access.log; }
Linguaggio codice: Nginx ( nginx )

Questo è tutto. Le miniature vengono ora generate correttamente al volo, mentre le immagini esistenti utilizzano anche intestazioni di scadenza appropriate. Facci sapere se questo ha funzionato per te o se hai utilizzato un approccio diverso. Buona programmazione!