.htaccess
01Введение
.htaccess — файл дополнительной конфигурации для децентрализованного управления конфигурацией веб сервера Apache. Позволяет задавать большое количество дополнительных параметров и разрешений для работы веб-сервера у отдельных пользователей (а также на различных папках отдельных пользователей), таких как управляемый доступ к каталогам, переназначение типов файлов и т.д., не предоставляя доступа к главному конфигурационному файлу, т.е. не влияя на работу всего сервиса целиком.
.htaccess является подобием httpd.conf с той разницей, что действует только на каталог, в котором располагается, и на его дочерние каталоги. Возможность использования .htaccess присутствует в любом каталоге пользователя. Файл .htaccess может быть размещен в любом каталоге сайта. Директивы этого файла действуют на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов .htaccess). Директивы .htaccess предоставляют пользователю широкий выбор возможностей по настройке своего сайта.
Список всех доступных директив можно посмотреть тут.
02Включение mod_rewrite
mod_rewrite — это модуль веб сервера Apache, использующийся для преобразования URL адресов. Под преобразованием следует понимать фактически любые действия с URL.
С помощью mod_rewrite можно настраивать редиректы, изменять URL адреса, блокировать доступ и т.д. Он поддерживает неограниченное количество правил преобразования, регулярные выражения, обратные связи с группированными частями шаблона, разные источники информации для преобразований (переменные сервера, HTTP заголовки, время и т.д.). За счет такого набора возможностей, достигается высокая функциональность и гибкость. По умолчанию этот модуль выключен, для того что бы его включить, в .htaccess необходимо добавить следующие директивы:
2
RewriteBase /#путь от корня сайта
03RewriteCond и RewriteRule
Для построения правил используются две директивы, RewriteCond и RewriteRule.
Директива RewriteCond определяют условия, при которых сработает правило преобразования RewriteRule. Если условие в RewriteCond выполнено, выполнятся правило в RewriteRule. Таких условий перед правилом RewriteRule может быть неограниченное количество. RewriteCond не является обязательной директивой для создания правила преобразования и может отсутствовать.
Директива RewriteRule указывает само правило для преобразования, которое для конкретного преобразования должно быть единственным.
04переадресация с домена с www на домен без www
В настоящее время приставка 'www' перед доменным именем является ана­хро­низ­мом, так как сайты с доменными именами mydomain.com и www.mydomain.com являются зеркалами друг друга. Многие поисковые системы воспринимают www.domain.com и domain.com как разные ресурсы, со всеми вытекающими отсюда неприятностями, влияющими на раскрутку сайта.
Чтобы избавиться от возникшей путаницы и иметь возможность раскручивать один сайт необходимо в файле .htaccess в корне сайта добавить переадресацию с домена с www на домен без www:
2
3
4
5
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.mydomain.com$ [NC]
RewriteRule (.*) https://mydomain.com/$1 [R=301]
либо сделать наоборот, и переадресовывать запросы с адреса без 'www' https://mydomain.com на адрес с 'www' https://www.mydomain.com:
2
3
4
5
RewriteBase /
RewriteCond %{HTTP_HOST} ^mydomain.com$ [NC]
RewriteRule (.*) https://www.mydomain.com/$1 [R=301]
Вышеприведенная модификация .htaccess хороша тем, что используя регулярные выражения, мы, тем самым, сохраняем структуру ссылки, то есть, например, при обращении к ресурсу 'www.mydomain.com/art?cat=name_cat' вы будете переадресованы на 'mydomain.com/art?cat=name_cat'.
Важно сделать склейку зеркал до регистрации в поисковых системах, так как последние выбирают главное зеркало как пожелают. Я рекомендую использовать первый вариант, так как от анахронизмов надо избавляться, но если время упущено и индексирование сайта произведено, то используйте первый или второй вариант исходя из сложившихся предпочтений ПС.
05Создание собственных страниц ошибок
Директива RewriteEngine включает или выключает работу механизма преобразования
06Кодировка веб страниц
Кодировка веб страницы определяется тем, в каком формате ее содержимое было сохранено перед загрузкой на сервер. Также в HTML5 прописывается заголовок, указывающий браузеру какую кодировку использовать:
Добавив директиву 'addDefaultCharset' в .htaccess можно задать кодировку для всех файлов в текущем каталоге и других каталогах, находящихся ниже в иерархическом дереве.
07Отображение ошибок в PHP
Во время написания и отладки сайта будет полезным произвести включение вывода ошибок и предупреждений в файле .htaccess. Очередность обрабатывания директив: параметр в php.ini, затем в .htaccess и в последнюю очередь проверяется указание на вывод ошибок непосредственно в скрипте PHP. Преимущество включения/выключения отображения ошибок заключается в том, что файл '.htaccess' всегда под рукой и в отсутствии необходимости перерывать код в поисках инструкций. После отладки необходимо не забыть закомментировать данную инструкцию и настроить логирование.
08Переменные сервера
Переменные сервера могут содержать много полезной информации, которую можно и нужно использовать для построения правил. Переменная $_SERVER - это массив, содержащий информацию, такую как заголовки, пути и местоположения скриптов. Примерный список этих переменных можно посмотреть здесь. Записи в этом массиве создаются веб-сервером, и нет никакой гарантии, что Ваш веб-сервер предоставит любую из них; сервер может опустить некоторые из них или предоставить другие, не указанные выше. Тем не менее, многие эти переменные присутствуют в спецификации CGI/1.1, так что вы можете ожидать их наличие.
Узнать, какие переменные передает конкретный сервер вместе со значениями можно вызвав функцию 'phpinfo();'.
09Отключение кэширования (актуально при разработке на php7)
В php7 кеширование включено по-умолчанию, что может помешать при написании кода. Для отслеживания правок в реальном времени кеширование следует отключить.
2
php_value xcache.cacher off# отключение использования прекомпилятора XCache
Яков Капустин (2018.10.02 23:20)