Recentemente, começamos a usar a plataforma Sylius cada vez mais popular para um de nossos projetos de comércio eletrônico. Sylius é baseado no Symfony2, o framework PHP líder com o qual trabalhamos em nosso site de fotografia . Embora usemos WooCommerce para projetos menores, Sylius oferece uma solução mais moderna e poderosa que acreditamos ser definitivamente mais adequada para sites de comércio eletrônico mais ambiciosos.
Um problema com o qual lutamos inicialmente foi fazer com que o Sylius funcionasse corretamente em nosso servidor da web Nginx + PHP-FPM + Ubuntu 14.04. Começamos com umarquivo de configuração padrão do Symfony2 mais algumas otimizações, mas não conseguimos fazer as miniaturas do produto funcionarem. Acontece que o LiipImagineBundle é usado para gerar miniaturas dinamicamente e isso estava interferindo em nosso conjunto de regras de expiração de cache, resultando em 404s para qualquer miniatura de imagem que tentássemos exibir.
Aqui está o que estávamos usando incorretamente para definir uma data de validade de 1 ano no futuro para arquivos 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;
}
Embora isso normalmente funcione sem problemas, também significa que qualquer URL terminando com uma dessas extensões irá ignorar completamente o arquivo app.php, quer o arquivo de imagem real exista ou não. Como as miniaturas no Sylius são criadas instantaneamente por meio de uma solicitação de URL, isso quebra completamente a criação de miniaturas.
A correção é muito simples: apenas definimos a data de validade para os arquivos solicitados que realmente existem. Caso contrário, nós os reescrevemos no arquivo app.php, como de costume. Aqui está o arquivo de configuração final do 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;
}
É isso aí. As miniaturas agora estão sendo geradas corretamente em tempo real, enquanto as imagens existentes também estão usando cabeçalhos de validade adequados. Deixe-nos saber se isso funcionou para você ou se você usou uma abordagem diferente. Boa codificação!