Posts Tagged ‘apache2’

А как вы проверяете mime-type файлов в php?

Вторник, Август 3rd, 2010

Как известно, все загружаемые на сервер файлы нужно проверять на соответствие разрешенным mime-type. Большинство программистов проверяют это соответствие, сверяясь с mime-типом из $_FILES, но этот mime-тип берется из заголовков HTTP запроса и может быть определен неправильно, т.к. определяет его браузер. У меня например, некоторые jpeg-файлы определяются как application/octet-stream и естественно, скрипт их не принимает. К тому же решение построенное на проверке mime-типа из HTTP заголовка потенциально опасно, т.к. заголовки можно подделать и указать любой mime-тип.

Как же сделать правильно?

Нужно установить расширение PECL, которое называется Fileinfo. Это расширение является заменой более старого расширения mime_magic. Валидатор MimeType в Zend Framework использует именно Fileinfo, как наиболее приоритетный способ определения mime-типа. Fileinfo определяет mime-тип по специальным сигнатурам, которые есть внутри файла.

Другой способ состоит в том, чтобы переложить определение mime-типа на веб-сервер. У веб-сервера Apache есть специальный файл magic с сигнатурами, с помощью которого он определяет, какого mime-типа является загружаемый файл, и устанавливает это значение в заголовок. Таким образом, в php скрипт придет верный mime-тип.

Для того, чтобы, Apache определял mime-тип файла, нужно включить модуль mod_mime_magic.

Небольшой офф: не забывайте так же проверять тип файлов еще и по расширению.

Кэширование и сжатие файлов в apache2

Четверг, Февраль 25th, 2010

Прочёл статью Настройка кеширования в Apache. Хотелось бы дополнить её, но только для Apache2. Первый апач рассматривать не буду, он устарел, а всегда нужно стремиться к новому :)

Итак, как правильно заметил автор, по-умолчанию в Apache кэширование и сжатие отключено. Чтобы их включить, нужно подключить в Apache нужные модули. Это модули mod_deflate, mod_expires и mod_headers.

Я сделал свой конфиг, он отличается от конфига из статьи тем, что ваш сайт будет работать, даже если нужных модулей не будет установлено или включено. Плюс, я добавил установку mime-типов и кодировки по расширению, полезная штука. Итак, вот конфиг:

# Добавляем mime-тип и кодировку
AddType 'text/css; charset=utf-8'  .css
AddType 'text/javascript; charset=utf-8'   .js
AddType 'image/x-icon; charset=utf-8' .ico
AddType 'text/html; charset=utf-8' .html .shtml
AddType 'text/xml; charset=utf-8'  .xml

# добавление сжатия файлов
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/xml image/x-icon text/css text/javascript

    # обработка "кривых" броузеров
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch Konqueror no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>

<IfModule mod_headers.c>
    Header append Vary User-Agent

    # разрешение кеширования файлов на стороне клиента
    <FilesMatch .*\.(css|js|php|phtml|shtml|html|xml)$>
        Header append Cache-Control private
    </FilesMatch>
</IfModule>

# включение заголовка Expires для всех файлов сроком на месяц
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 month"

    # выключение Expires для HTML-файлов и PHP-скриптов
    <FilesMatch .*\.(shtml|html|phtml|php)$>
        ExpiresActive Off
    </FilesMatch>
</IfModule>

# Выдача заголовка ETag (core feature)
FileETag MTime Size

Положите эти настройки в корневой .htaccess на вашем сайте и подключите модули, указанные в начале статьи. Всё должно работать.

Вот готовый архив с модулями для windows-инсталляции Apache2. Линуксойды же справятся сами, использовав утилиту a2enmod :)