Руководство по .htaccess и mod_rewrite
Краткое руководство по htaccess и mod_rewrite
Использование Apache-”фишек” mod_rewrite и htaccess считается чем-то недостижимым среди многих разочаровавшихся веб-мастеров, однако это одна из наиболее сложных задач, с которыми встречаются практически все веб-разработчики.
Хочу предложить вам простое решение вместо поиска более сложных для того, чтобы понять как работают mod_rewrite и htaccess. Большинство примеров использования, приведённые в этой статье могут быть просто скопированы и выгружены на ваш веб-сервер.
Чтобы не повторять одно и то же сотням других вебмастеров, я решил просто создать эту страницу-подсказку для всеобщего пользования.
Повторюсь, htaccess - это конфигурационный файл, который позволяет управлять веб-сервером Apache, mod_rewrite - это движок перезаписи, с помощью которого веб-сервер может модифицировать URL при их загрузке.
Файл htaccess - это текстовый файл, который имеет название .htaccess. Можно даже сказать, что это файл, состоящий только из расширения, потому как не содержит именной части (до символа “точка”). Обычно этот файл расположен в основной корневой директории вашего сервера, но вы также можете создавать отдельные файлы htaccess для различных директорий на своем сайте.
Канонизация
Самая простейший пример - сделать так, чтобы сайт не содержал ошибок канонизации для домашней страницы.
Множество веб-мастеров страдают от не очень хорошего ранжирования в поисковых системах из-за того, что существуют несколько версий URL домашней страницы, например:
http://www.site.com
http://site.com
http://www.site.com/index.html
http://site.com/index.html
Эти страницы выглядят как различные URL, несмотря на то, что они указывают на одно и то же содержание. Google в конечном итоге решит, какая из версий более правильная, но может пройти немало времени, а вы за это время можете поиметь лишние проблемы.
Чтобы решить эту проблему, просто добавьте следующие строки в свой htaccess-файл:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^site.com
RewriteRule (.*) http://www.site.com/$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ http://www.site.com/ [R=301,L]
Данный код позволит перенаправлять все возможные варианты домашней страницы на http://www.site.com.
Превращение файлов HTML в PHP
Иногда вам необходимо использовать PHP-код на HTML-страницах статического сайта. Вместо того, чтобы перенаправлять все свои HTML-страницы на их эквивалентные PHP-версии, вам просто необходимо “сказать” своему серверу, что он должен парсить HTML-файлы как PHP.
AddHandler application/x-httpd-php .html
Данный код работает с любыми файлами, поэтому, если вы захотите создать динамические XML- или ASP-файлы, которые будут вести себя как PHP-файлы, вам просто нужно внести следующие изменения:
AddHandler application/x-httpd-php .xml
AddHandler application/x-httpd-php .asp
Страницы ошибок
Пользовательские страницы ошибок могут быть легко настроены, например в CPanel (или DirectAdmin), но, если вы захотите настроить страницу ошибки через htaccess-файл, добавьте в него следующую строку:
# Обработка ошики 404 - Файл не найден
ErrorDocument 404 http://www.site.com/404.php
# Обработка ошики 403 - Доступ запрещен
ErrorDocument 403 http://www.site.com/403.php
Индексация директорий
Чтобы запретить роботу Google индексировать директории вы должны определить индексную страницу для необходимых директорий. Это не является обязательным на некоторых серверах.
DirectoryIndex index.php3
Я предпочитаю делать перенаправление на индексную страницу директории или другую подходящую страницу. Например, www.site.com/images/ может быть перенаправлен на www.site.com, а www.site.com/forum/ может быть перенаправлен на www.site.com/forum/index.php
Перенаправляющие страницы
Отличный пример использования htaccess для перенаправления одной страницы на другую:
redirect 301 /old-page.php http://www.site.com/new-page.php
Перенаправление вашего фида на Feedburner
Если вы хотите переключить ваш фид на сервис Feedburner, вам необходимо будет перенаправить свой текущий фид на новый адрес http://feeds.feedburner.com/blog-feed.
Перенаправление должно применяться для всех посетителей кроме робота Feedburner:
RewriteCond %{HTTP_USER_AGENT} !FeedBurner
RewriteRule ^ваш-фид\.xml$ http://feeds.feedburner.com/blog-feed [R,L]
Улучшенная хотлинк-защита
Если вы хотите запретить другим веб-сайтам напрямую ссылаться на изображения, расположенные на вашем сайте, но позволить поисковикам Google, Yahoo и MSN индексировать их, вам необходимо воспользоваться следующим кодом:
RewriteEngine on
RewriteCond %{HTTP_REFERER} .
RewriteCond %{HTTP_REFERER} !^http://([^.]+\.)?site\. [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{REQUEST_URI} !^/hotlinker\.gif$
RewriteRule \.(gif|jpg|png)$ /hotlinker.gif [NC,L]
Изображение hotlinker.gif - это изображение, которое создано вами. Я предлагаю использовать что-то типа “Это изображение находится на сайте www.site.com” и ваш логотип.
Лично я разрешаю хотлинк, но использую определённое решение, которое использует сервис Google Images и сайты-хотлинкеры для получения ссылок на свой сайт.
Создание ЧПУ ссылок с помощью mod_rewrite
Модуль перезаписи Apache в основном используется для превращения динамических URL вида www.site.com/product.php?id=123 в статические и дружественные пользователю вида www.site.com/product/123.
RewriteEngine on
RewriteRule ^product/([^/\.]+)/?$ product.php?id=$1 [L]
Еще один пример, который приводит URL: www.yoursite.com/script.php?product=123 к виду www.yoursite.com/cat/product/123/
RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2
Удаление строк запросов
Некоторые сайты ссылаются на ваш, добавляя строку запроса. Например, можно сослаться на ваш сайт, используя эту ссылку http://www.site.com/index.php?source=seoblog, просто для того, чтобы знать откуда приходит трафик. Это становится причиной появления дублирующегося содержания для вашего сайта, поэтому вам нужно настроить перенаправление на вашу домашнюю страницу:
RewriteCond %{QUERY_STRING} ^source= RewriteRule (.*) /$1? [R=301,L]
Пока все. Если есть, что добавить, прошу в каменты…
На большинства хостингов установлено две и больше версий PHP. Обычно поумолчанию стоит 4-я. Однако, для того, что бы ваши PHP скрипты обрабатывались в 5-й версии, вы можете прописать в htaccess:
AddType application/x-httpd-php5 .php
Или можете добавлять к каждому файлу расширение .php5 вместо просто .php.
Это на случай если вам лень редиктировать htaccess.
Примеры настройки файла .htaccess
Пока некоторые наши доблестные сео “гуру” переводят иностранные статьи, не утруждая себя установкой ссылки на оригинал статьи, приведу вам подборку кодов для настройки .htaccess.
Почти все пункты являются обязательными, кроме
- редиректа и блокировки - они настраиваются по мере необходимости
- а также настройки ЧПУ (ЧеловекоПонятныхУРЛ) - как правило, можно обойтись функционалом CMS
Как создать .htaccess?
- открываем блокнот
- пишем код (можно и потом это сделать:)
- сохраняем документ с названием .htaccess
- заливаем в корень сайта (или в папку на сервере, где будем производить настройки)
* yoursitename.ru в примерах заменяйте на адрес вашего домена
Настройки htaccess по умолчанию
1. Установка главной страницы по умолчанию
DirectoryIndex pagename.html
2. Определение страниц ошибок (error) в .htaccess
ErrorDocument 403 /403.phpСоответственно адрес и название файла могут быть другими, например /error/page404.html
ErrorDocument 404 /404.php
ErrorDocument 500 /500.php
3. Защита от хотлинков
То, что контент с сайтов воруют, это уже давно не новость. Но бывает, что прут вместе с картинками. Вот дабы избежать нагрузки на сервер и раздутия траффика, пишем:
RewriteEngine OnЕсли хотите, чтобы на чужом сайте вместо 403 ошибки появлялась определенная картинка, последнюю строку следует заменить на:
RewriteCond %{HTTP_REFERER} !^$
#домены, которые могут ссылаться на картинки с вашего сайта
RewriteCond %{HTTP_REFERER} !^http://([ -a-z0-9] \.)?yoursitename\.ru [NC]
#не показывать картинки при хотлинках
RewriteRule \.(gif|jpe?g|png)$ - [F,NC,L]
RewriteRule \.(jpg|png|gif)$ http://yoursitename.ru/images/imagename.jpg [NC,R,L]
4. Принудительно сохранение файла вместо открытия
Если хотите, чтобы посетители вместо просматра файла онлайн сохраняли его, то в .htaccess пишем:
AddType application/octet-stream .doc .mov .avi .pdf .xls .mp4
5. Кэширование файлов
В WordPress для этого есть специальный плагин: wp-super-cache. Если вы же пользуетесь CMS, которая кэширование не поддерживает, то можно произвести следующие настройки в .htaccess
#кэширование html и htm на суткиПараметр max-age приведен в секундах.
<FilesMatch ".(html|htm)$">
Header set Cache-Control "max-age=43200"
</FilesMatch>
#кэширование css, javascript и txt-файлов на неделю
<FilesMatch ".(js|css|txt)$">
Header set Cache-Control "max-age=604800"
</FilesMatch>
#кэширование flash и картинок на месяц
<FilesMatch ".(flv|swf|ico|gif|jpg|jpeg|png)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
#запрет на кэширование скриптов
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
6. Включение ошибок на время отладки
php_flag display_errors on
Настройка редиректа с помощью .htaccess
1. 301 редирект
Оптимальное решение для перенаправления посетителей со старых адресов на новые, если со временем структура сайта менялась, а старые URL’ы могли где-то остаться.
Redirect 301 /oldpage.html http://yoursitename.ru/newpage.html
Встречается еще такой вариант:
Redirect permanent /oldpage.html http://yoursitename.ru/newpage.htmlНо в чем принципиальная разница между ними, честно говоря, объяснить не смогу. Может кто из читателей подскажет.
2. Склеивание доменов с www и без www
Редирект с адреса yoursitename.ru на www.yoursitename.ru
RewriteEngine OnОбратный редирект
RewriteBase /
RewriteCond %{HTTP_HOST} !^www.yoursitename.ru$ [NC]
RewriteRule ^(.*)$ http://www.yoursitename.ru/$1 [L,R=301]
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^yoursitename.ru$ [NC]
RewriteRule ^(.*)$ http://yoursitename.ru/$1 [L,R=301]
3. 302 редирект
Если вы ведете работы на сайте, то можете временно отправлять посетителей на нужную страницу (например, с описание того, когда планируется завершение работ и как можно с вами связаться).
RewriteEngine onПросмотр сайта будет возможен только с вашего ip-адреса - 12.345.678.90
RewriteCond %{REQUEST_URI} !/informpage.html$
RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90
RewriteRule $ http://yoursitename.ru/informpage.html [R=302,L]
4. Переадресация на другой сайт
Переадресация всех посетителей на другой сайт, помимо указанных ip-адресов
ErrorDocument 403 http://www.yoursitename.ru
Order deny,allow
Deny from all
Allow from 12.345.678.90
Allow from 12.345.678.92
5. Переадресация на безопасное https соединения
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Запрет/блокировка с помощью .htaccess
1. Запрет на листинг директории
Используется при отсутствии индексного файла, если хотите запретить просмотр содержимого папки (например, для images):
Options All -IndexesОбратный код, в смысле разрешение
Options +Indexes
2. Блокировка доступа к файлу
Например, это может быть ваш .htaccess
<Files .htaccess>
order allow,deny
deny from all
</Files>
3. Блокировка доступа к директории
Закрыть доступ только к определенной папке
<Directory /root-access/>Разрешение доступа только с определенных IP к определенной папке (адреса записываются через пробел):
Order allow,deny
# Всем, кроме ...
allow from all
Deny from 198.69.
</Directory>
# Указываем папку, к которой запрещаем доступ по имени хоста и его IPТакже есть возможность указывать в одном списке и хост-имя и IP-адрес:
<Directory /root-access/>
Order deny, allow
deny from all
#Адреса записываются через пробел
Allow from 198.69.144.98 198.69.144.94 198.69.144.92
</Directory>
# Указываем папку, к которой запрещаем доступ по имени и IP
<Directory /root-access/>
Order allow,deny
# Всем, ...
allow from all
# ... кроме имя хоста и его IP
Deny from robot.fromx.com 148.145.21.14
</Directory>
4. Блокировка по ip
Чтобы спамеры не надоедали
<Limit GET>Будут заблокированы:
Order Deny,Allow
Deny from 12.345.678.90
Deny from 90.876.543.
Deny from .tvoe.tv
Allow from all
</Limit>
- юзер с ip 12.345.678.90
- все посетители с ip, попадающими в диапазон от 90.876.543.0 до 90.876.543.255
- и все посетители от провайдера tvoe.tv
Запретить доступ с определенного IP-адреса
#Запрет с 16:18 31-03-2011Закрыть доступ ВСЕМ, кроме определенных IP
Order allow,deny
allow from all
Deny from 198.69.132.24
Order deny,allowВ случае, если необходимо закрыть доступ по маске то используем неполный адрес:
deny from all
# Список IP через пробел, с которых доступ разрешен
Allow from 194.111.70.48 194.78.47.128
# неполный адресЗакрыть доступ по маске:
198.69.
# полные адреса, соответствующие первому
198.69.132.24
198.69.136.89
198.69.1.8
#Запрет с 06:18 31-03-2011
Order allow,deny
allow from all
Deny from 198.69.
Настройка ЧПУ с помощью .htaccess
Вообще, если вы работаете с WordPress, то настроить “дружелюбные” url можно в разделе Настройки » Постоянные ссылки (ЧПУ). Многие CMS так же поддерживают настройку адреса страницы. Поэтому, если есть возможность, сначала попробуйте обойтись функционалом движка, и потом уже приступайте к настройке htaccess.
1. Как убрать из адреса ?p=
По умолчанию адрес страницы выглядит следующим образом: yoursitename.ru/?p=xxxx, где xxxx - id статьи.
RewriteCond %{REQUEST_URI} ^/([0-9]+)$
RewriteRule .* http://yoursitename.ru/?p=%1 [R=301,L]
2. Как убрать из адреса category
По аналогии с прошлым способом пишем
RewriteRule ^category/(.+)$ http://yoursitename.ru/$1 [R=301,L]
Created/Updated: 25.05.2018