Recientemente, comenzamos a utilizar la plataforma Sylius, cada vez más popular, para uno de nuestros proyectos de comercio electrónico. Sylius se basa en Symfony2, el framework PHP líder con el que hemos trabajado en nuestro sitio web de fotografía . Aunque usamos WooCommerce para proyectos más pequeños, Sylius proporciona una solución más moderna y poderosa que creemos que definitivamente es más adecuada para sitios web de comercio electrónico más ambiciosos.
Un problema con el que luchamos inicialmente fue lograr que Sylius funcionara correctamente en nuestro servidor web Nginx + PHP-FPM + Ubuntu 14.04. Comenzamos con unarchivo de configuración estándar de Symfony2 más algunas optimizaciones, pero no pudimos hacer funcionar ninguna miniatura de producto. Resulta que LiipImagineBundle se usa para generar miniaturas sobre la marcha, y esto estaba interfiriendo con nuestro conjunto de reglas de caducidad de caché, lo que resultó en 404 para cualquier miniatura de imagen que intentáramos mostrar.
Esto es lo que estábamos usando incorrectamente para establecer una fecha de vencimiento de 1 año en el futuro para los archivos estáticos:
location ~ \.(js|css|png|jpeg|jpg|gif|ico|swf|flv|pdf|zip)$ { # Set expiry date to 1 year in the future. expires 365d ; }
Lenguaje de código: Nginx ( nginx )
Si bien esto normalmente funciona sin problemas, también significa que cualquier URL que termine con una de esas extensiones omitirá por completo el archivo app.php, ya sea que exista o no el archivo de imagen real. Dado que las miniaturas en Sylius se crean sobre la marcha tras una solicitud de URL, esto rompe completamente la creación de miniaturas.
La solución es muy sencilla: solo establecemos la fecha de caducidad para los archivos solicitados que realmente existen. De lo contrario, los reescribimos en el archivo app.php, como de costumbre. Aquí está el archivo de configuración final de Nginx que usamos:
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; }
Lenguaje de código: Nginx ( nginx )
Eso es todo. Las miniaturas ahora se generan correctamente sobre la marcha, mientras que las imágenes existentes también utilizan los encabezados de caducidad adecuados. Háganos saber si esto funcionó para usted o si utilizó un enfoque diferente. ¡Feliz codificación!