Небольшие основы по .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://speckyboy.com/useful-htaccess-snippets-and-hacks/
https://habrahabr.ru/post/165701/