Небольшие основы по .htaccess
Все помнят зачем нужен этот блог? Правильно. Этот блок — моя записная книжка на которую я «подзабил», но планирую это исправлять.
Очередной раз мне понадобилось что-то изменить в файле .htaccess у какого-то проекта, в итоге очередной раз пришлось «гуглить».. Потом опять.. И снова… Короче, держите краткую инструкцию по некоторым функциям .htaccess
Что такое mod_rewrite?
mod_rewrite — это модуль для веб-сервера Apache, предназначенный для преобразования URL-ов. Модуль использует в своей работе правила, которые могут быть описаны как в конфигурации сервера (httpd.conf), так и в файлах .htaccess непосредственно в файловой структуре Вашего сайта. Правила описываются в виде регулярных выражений PCRE.
Собственно в каждом файле .htaccess, в самом начале должна быть размещена следующая строка, которая включает этот чудо механизм:
RewriteEngine On
А теперь примеры …
Определяем стартовую страницу
Тут есть два способа. Первый:
DirectoryIndex index.html
второй, для нескольких вариантов
DirectoryIndex index.shtm index.php3 index.php index.htm index.html
Если стартовая не index.php, а например megasaytblin.htm, то добавьте в htaccess эту строку:
DirectoryIndex megasaytblin.htm
Запретить или разрешить листинг файлов (просмотр директории сайта)
Некоторые серверы разрешают просмотр файлов в директории (что не очень хорошо, так как можно получить целый листинг файлов). Но в основном все запрещают. Данные пример показывает как закрыть просмотр директории сайта:
Options All -Indexes
Если нужда заставляет открывать доступ к просмотру директории, то открывается он так:
Options All +Indexes
Кодировка
Данный пример показывает, в какой кодировке сервер будет отдавать документы, т.е. это default кодировка:
AddDefaultCharset windows-1251
А в данном примере мы устанавливаем кодировку на файлы на сервере:
CharsetSourceEnc windows-1251
Закрыть доступ к определенной директории
Ну тут все просто, в файле .htaccess достаточно указать следующую строку:
deny from all
Если хотим закрыть доступ к директории всем, кроме определенного IP, то делаем так:
order allow deny deny from all allow from $ip
Если хотим запретить доступ к директории определенному IP адресу, то достаточно сделать так:
order allow deny deny from all deny from $ip
Закрыть доступ к определенному файлу / файлам
В данном примере мы блокируем доступ к файлу .htaccess:
<Files .htaccess> order allow,deny deny from all </Files>
Так же есть возможность заблокировать доступ к файлам определенного типа:
<FilesMatch ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$"> Order Allow,Deny Deny from all </FilesMatch>
Еще один пример блокировки сайта по маске:
<Files "\.(tar|gif|png|...|xml)$"> order allow,deny deny from all </Files>
Заблокировать посетителей перешедших с определенного домена
Сделать это можно добавив следующий код в файл:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} plohoysite1.com [NC,OR] RewriteCond %{HTTP_REFERER} plohoysite2.com [NC,OR] RewriteRule .* - [F] </ifModule>
Флаг [NC] указывает что введенные домен не чувствителен к регистру
Флаг [F] указывает серверу выдавать 403 ошибку (Forbidden)
При блокировке нескольких сайтов используйте флаги [NC, OR]
При блокировке определенного сайта используйте флаг [NC]
Запретить вставку изображений со сторонних ресурсов
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?site.ru [NC] RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
Переадресация с кодом 301
Перенаправить запросы на site.ru с любого из синонимов сайта
RewriteCond %{HTTP_HOST} !^site\.ru$ [NC] RewriteRule ^(.*)$ http://site.ru/$1 [L,R=301]
Перенаправить запросы на www.site.ru с любого из синонимов сайта
RewriteCond %{HTTP_HOST} !^www\.site\.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [L,R=301]
Правила касающиеся переадресации лучше всегда размещать в самом начале файла.
Переадресация с http на https
Для нормальной переадресации с небезопасного http на безопасный https достаточно добавить эти строки:
RewriteEngine On RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Сжатие файлов
При помощи htaccess можно сжать JavaScript или другие различные типы файлов:
AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/rss+xml
Можно сжать все файлы JavaScript, HTML и CSS при помощи GZIP:
<IfModule mod_gzip.c> mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text\.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude mime ^image\.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* </IfModule>
Можно сжать HTML
AddOutputFilterByType DEFLATE text/html
или любые текстовые файлы:
AddOutputFilterByType DEFLATE text/plain
Кэширование файлов
С htaccess можно кешировать файлы. Напрмер так мы можем «статику» (расширения можно указать любые) на определенное время ( указывать в секундах в переменной max-age) :
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$"> Header set Cache-Control "max-age=2592000" </FilesMatch>
Так же можно отключить кеширование для динамики:
<FilesMatch ".(pl|php|cgi|spl|scgi|fcgi)$"> Header unset Cache-Control </FilesMatch>
Настройки PHP
Так же при помощи mode_rewrite можно влиять на работу PHP интерпретатора.
Так можно изменить время выполнения скриптов (в секундах):
php_value max_execution_time 240
Так можно изменить размер загружаемых файлов:
php_value upload_max_filesize 20M
Так можно изменить размер передаваемых при загрузке в PHP данных:
php_value post_max_size 15M
Так можно изменить время работы скрипта (или правильнее будет сказать, анализа скриптом исходных данных, в секундах)
php_value max_input_time 200
Обход диалога загрузки
Цитата:
По умолчанию при попытке загрузить файл с веб-сервера отображается диалог, который спрашивает вас, хотите ли вы сохранить файл или открыть его. Этот диалог особенно раздражает при скачивании больших медиа- или PDF-файлов. Если файлы, которые вы загрузили на сервер, предназначены исключительно для скачивания, вы можете облегчить жизнь пользователей, установив загрузку действием по умолчанию. Добавьте в. htaccess следующее:
AddType application/octet-stream .pdf AddType application/octet-stream .zip AddType application/octet-stream .mp3
Обработка ошибок
Пример ниже показывает, как мы можем обрабатывать ошибки на сервере:
ErrorDocument 401 /err/401.html #Требуется авторизация (Authorization Required) ErrorDocument 403 /err/403.html #Нет доступа (Forbidden) ErrorDocument 404 /err/404.html #Не найден файл (File not found) ErrorDocument 500 /err/500.html #Внутренняя ошибка сервера (Internal Server Error)
Естественно это не все что умеет htaccess, и по мере необходимости, будет еще одна часть с описанием возможностей htaccess и полезных рецептов. Если что-то пропустил или что-то стоит еще дописать — пишите в комментариях.
Материалы, которые я использовал:
http://htaccess.net.ru/
http://www.internet-technologies.ru/articles/article_1381.html
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
https://habrahabr.ru/post/165701/