Récemment, nous avons commencé à utiliser la plateforme Sylius de plus en plus populaire pour l'un de nos projets de commerce électronique. Sylius est basé sur Symfony2, le principal framework PHP avec lequel nous avons travaillé sur notre site de photographie . Même si nous utilisons WooCommerce pour des projets plus petits, Sylius fournit une solution plus moderne et plus puissante qui, selon nous, est certainement mieux adaptée aux sites Web de commerce électronique plus ambitieux.
Un problème avec lequel nous nous sommes d'abord battus était de faire fonctionner Sylius correctement sur notre serveur Web Nginx + PHP-FPM + Ubuntu 14.04. Nous avons commencé avec unfichier de configuration Symfony2 standard plus quelques optimisations, mais nous n'avons pas pu faire fonctionner les vignettes de produits. Il s'avère que LiipImagineBundle est utilisé pour générer des miniatures à la volée, ce qui interférait avec notre ensemble de règles d'expiration du cache, ce qui entraînait des 404 pour toutes les miniatures d'image que nous essayions d'afficher.
Voici ce que nous n'utilisions pas correctement pour définir une date d'expiration d'un an dans le futur pour les fichiers statiques:
location ~ \.(js|css|png|jpeg|jpg|gif|ico|swf|flv|pdf|zip)$ { # Set expiry date to 1 year in the future. expires 365d ; }
Langage du code: Nginx ( nginx )
Bien que cela fonctionne normalement sans problème, cela signifie également que toute URL se terminant par l'une de ces extensions contournera complètement le fichier app.php, que le fichier image réel existe ou non. Étant donné que les miniatures dans Sylius sont créées à la volée suite à une demande d'URL, cela interrompt complètement la création de miniatures.
Le correctif est très simple: nous ne définissons la date d'expiration que pour les fichiers demandés qui existent réellement. Sinon, nous les réécrivons dans le fichier app.php, comme d'habitude. Voici le fichier de configuration final Nginx que nous avons utilisé:
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; }
Langage du code: Nginx ( nginx )
C'est tout. Les vignettes sont désormais correctement générées à la volée, tandis que les images existantes utilisent également les en-têtes d'expiration appropriés. Faites-nous savoir si cela a fonctionné pour vous ou si vous avez utilisé une approche différente. Bon codage!