Перейти к основному содержимому

Конфигурация Apache

.htaccess

Все необходимые правила переписывания (rewrite rules), которые требуются для работы Pimcore, должны быть определены в файле.htaccess, расположенном по путиpublic/.htaccess, как показано ниже:

# Использовать front controller в качестве index-файла.
# Он служит запасным решением, если все остальные правила
# rewrite/redirect не сработали (например, в алиасной среде
# без mod_rewrite). Кроме того, это уменьшает количество
# операций сопоставления для стартовой страницы (путь "/"),
# так как в противном случае Apache применял бы правила
# переписывания к каждому настроенному файлу DirectoryIndex
# (например, index.php, index.html, index.pl).
DirectoryIndex index.php

# По умолчанию Apache не обрабатывает символические ссылки,
# если эта возможность не включена в конфигурации сервера.
# Раскомментируйте следующую строку, если вы устанавливаете
# ассеты как симлинки или если возникают проблемы, связанные
# с симлинками при компиляции ассетов LESS/Sass/CoffeeScript.
# Options FollowSymlinks

# Отключение MultiViews предотвращает нежелательное согласование,
# например, путь "/index" не должен разрешаться во front controller
# "/index.php", а должен быть переписан в "/index.php/index".
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

# MIME-типы
AddType video/mp4 .mp4
AddType video/webm .webm
AddType image/webp .webp
AddType image/jpeg .jpeg

Options +SymLinksIfOwnerMatch

# Использовать кодировку UTF-8 для всего, что отдается как text/plain или text/html
AddDefaultCharset utf-8

RewriteEngine On

<IfModule mod_headers.c>
<FilesMatch "\.(jpe?g|png)$">
Header always unset X-Content-Type-Options
</FilesMatch>
</IfModule>

# Автоматически определяет RewriteBase и сохраняет его в переменную окружения.
# Если вы используете алиасы Apache для массового виртуального хостинга
# или установили проект в поддиректорию, базовый путь будет добавлен,
# чтобы корректно разрешать файл index.php и перенаправлять на правильный URI.
# Также работает в окружениях без префикса пути, предоставляя безопасное,
# универсальное решение. Однако если это не требуется, можно закомментировать
# следующие 2 строки, чтобы убрать лишние накладные расходы.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

# Устанавливает HTTP-заголовок AUTHORIZATION, который Apache удаляет
RewriteCond %{HTTP:Authorization} .
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# Перенаправление URI без front controller для предотвращения
# дублирующегося контента (с /index.php и без него)
# Выполняйте это перенаправление только на первом цикле
# переписывания Apache, а не на последующих. В противном случае
# возникнет бесконечный цикл редиректов (request -> rewrite to front controller ->
# redirect -> request -> ...).
# Если вы получаете ошибку "too many redirects" или вас всегда перенаправляет на стартовую страницу,
# потому что Apache не предоставляет переменную окружения REDIRECT_STATUS,
# у вас есть два варианта:
# - отключить эту функциональность, закомментировав следующие 2 строки, или
# - использовать Apache >= 2.3.9 и заменить все флаги L на END,
# а также удалить следующий RewriteCond (лучшее решение).
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]

<IfModule mod_status.c>
RewriteCond %{REQUEST_URI} ^/(fpm|server)-(info|status|ping)
RewriteRule . - [L]
</IfModule>

# Ограничение доступа к dot-файлам
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule /\.|^\.(?!well-known/) - [F,L]

# ASSETS: проверка, что метод запроса — GET (из-за WebDAV), и что запрашиваемый файл (ассет) существует в файловой системе
RewriteCond %{REQUEST_METHOD} ^(GET|HEAD)
RewriteCond %{DOCUMENT_ROOT}/var/assets%{REQUEST_URI} -f
RewriteRule ^(.*)$ /var/assets%{REQUEST_URI} [PT,L]

# Миниатюры (thumbnails)
RewriteCond %{REQUEST_URI} .*/(image|video)-thumb__[\d]+__.*
RewriteCond %{DOCUMENT_ROOT}/var/tmp/thumbnails%{REQUEST_URI} -f
RewriteRule ^(.*)$ /var/tmp/thumbnails%{REQUEST_URI} [PT,L]

# Статические страницы
SetEnvIf Request_URI ^(.*)$ STATIC_PAGE_URI=$1
SetEnvIf Request_URI / STATIC_PAGE_URI=/%home

RewriteCond %{REQUEST_METHOD} ^(GET|HEAD)
RewriteCond %{QUERY_STRING} !(pimcore_editmode=true|pimcore_preview|pimcore_version)
RewriteCond %{DOCUMENT_ROOT}/var/tmp/pages%{STATIC_PAGE_URI}.html -f
RewriteRule ^(.*)$ /var/tmp/pages%{STATIC_PAGE_URI}.html [PT,L]

# Правило cache-buster для скриптов и стилей, подключенных с использованием view helpers
RewriteRule ^cache-buster\-[\d]+/(.*) $1 [PT,L]

# Если запрашиваемый файл существует — просто отдать его.
# Apache должен обслуживать только файлы, но не директории.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# Переписать все остальные запросы во front controller.
RewriteRule ^ %{ENV:BASE}/index.php [L]




##########################################
### НЕОБЯЗАТЕЛЬНЫЕ ОПТИМИЗАЦИИ ПРОИЗВОДИТЕЛЬНОСТИ ###
##########################################

<IfModule mod_deflate.c>
# Принудительное сжатие для некорректных заголовков.
# http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>

# Сжимать весь вывод с одним из следующих MIME-типов
# (для версий Apache ниже 2.3.7 не требуется включать `mod_filter`
# и можно удалить строки `<IfModule mod_filter.c>` и `</IfModule>`,
# так как директива `AddOutputFilterByType` уже входит в основной набор).
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml application/javascript application/json \
application/vnd.ms-fontobject application/x-font-ttf application/rss+xml \
application/x-web-app-manifest+json application/xhtml+xml \
application/xml font/opentype image/svg+xml image/x-icon \
text/css text/html text/plain text/x-component text/xml text/javascript
</IfModule>
</IfModule>

<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 31536000 seconds"

# Переопределения для отдельных типов
#ExpiresByType text/css "access plus 1 year"
</IfModule>

<IfModule pagespeed_module>
# Интеграция pimcore с mod_pagespeed
# Pimcore автоматически отключает mod_pagespeed в следующих случаях:
# включен debug-режим, /admin, preview, editmode и т.д.
# Если требуется отключить pagespeed для отдельных действий в Pimcore,
# можно использовать $this->disableBrowserCache() в экшене
RewriteCond %{REQUEST_URI} ^/(mod_)?pagespeed_(statistics|message|console|beacon|admin|global_admin)
RewriteRule . - [L]

ModPagespeed Off
AddOutputFilterByType MOD_PAGESPEED_OUTPUT_FILTER text/html
ModPagespeedModifyCachingHeaders off
ModPagespeedRewriteLevel PassThrough
# Фильтры с низким риском
ModPagespeedEnableFilters remove_comments,recompress_images
# Фильтры с низким и средним риском, рекомендуемые, но потенциально проблемные
ModPagespeedEnableFilters lazyload_images,extend_cache_images,inline_preview_images,sprite_images
ModPagespeedEnableFilters combine_css,rewrite_css,move_css_to_head,flatten_css_imports,extend_cache_css,prioritize_critical_css
ModPagespeedEnableFilters extend_cache_scripts,combine_javascript,canonicalize_javascript_libraries,rewrite_javascript
# Высокий риск
#ModPagespeedEnableFilters defer_javascript,local_storage_cache
</IfModule>

Виртуальные хосты

Убедитесь, что для DocumentRoot установлено значение AllowOverride All, так как это включает поддержку файла .htaccess.

Example

<VirtualHost *:443>  
ServerName YOUPROJECT.local
DocumentRoot /var/www/public

<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/pimcore.sock|fcgi://localhost"
</FilesMatch>

<Directory /var/www/public>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>

SSLEngine on
# ТРЕБУЕТСЯ ИЗМЕНИТЬ
SSLCertificateFile /etc/getssl/YOUPROJECT.local/YOUPROJECT.local.crt
SSLCertificateKeyFile /etc/getssl/YOUPROJECT.local/YOUPROJECT.local.key
SSLCertificateChainFile /etc/getssl/YOUPROJECT.local/chain.crt

RewriteEngine On

# СЛЕДУЮЩЕЕ ПРАВИЛО ДОЛЖНО БЫТЬ ПОСЛЕДНИМ RULE В ЭТОМ VHOST
# необходимо для корректной передачи заголовка авторизации в окружении fastcgi
RewriteRule ".*" "-" [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

ErrorLog ${APACHE_LOG_DIR}/YOUPROJECT.local_443_error.log
CustomLog ${APACHE_LOG_DIR}/YOUPROJECT.local_443_access.log combined
</VirtualHost>


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.