Недавно мы начали использовать набирающую популярность платформу Sylius для одного из наших проектов электронной коммерции. Sylius основан на Symfony2, ведущем PHP-фреймворке, с которым мы работали на нашем сайте фотографий . Несмотря на то, что мы используем WooCommerce для небольших проектов, Sylius предлагает более современное и мощное решение, которое, по нашему мнению, определенно лучше подходит для более амбициозных веб-сайтов электронной коммерции.
Проблема, с которой мы изначально боролись, заключалась в том, чтобы заставить Sylius правильно работать на нашем веб-сервере Nginx + PHP-FPM + Ubuntu 14.04. Мы начали состандартного файла конфигурации Symfony2 плюс некоторые оптимизации, но не смогли заставить работать эскизы продуктов. Оказывается, LiipImagineBundle используется для генерации миниатюр на лету, и это мешает нашему набору правил истечения срока действия кеша, в результате чего для любых миниатюр изображений, которые мы пытались отобразить, приходилось 404 с.
Вот что мы неправильно использовали, чтобы установить срок годности 1 год в будущем для статических файлов:
location ~ \.(js|css|png|jpeg|jpg|gif|ico|swf|flv|pdf|zip)$ { # Set expiry date to 1 year in the future. expires 365d ; }
Язык кода: Nginx ( nginx )
Хотя обычно это работает без проблем, это также означает, что любой URL-адрес, заканчивающийся одним из этих расширений, будет полностью обходить файл app.php независимо от того, существует ли фактический файл изображения. Поскольку миниатюры в Sylius создаются «на лету» по запросу URL, это полностью нарушает создание миниатюр.
Исправить очень просто: мы устанавливаем срок годности только для запрошенных файлов, которые действительно существуют. В противном случае, как обычно, перепишем их в файл app.php. Вот последний файл конфигурации Nginx, который мы использовали:
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; }
Язык кода: Nginx ( nginx )
Вот и все. Миниатюры теперь правильно создаются на лету, в то время как существующие изображения также используют правильные заголовки истечения срока действия. Сообщите нам, сработало ли это для вас или вы использовали другой подход. Удачного кодирования!