Руководство по .htaccess и mod_rewrite

По теме:


Файл-конфигуратор Apache-серверов .htaccess


Краткое руководство по 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?

  1. открываем блокнот
  2. пишем код (можно и потом это сделать:)
  3. сохраняем документ с названием .htaccess
  4. заливаем в корень сайта (или в папку на сервере, где будем производить настройки)

* yoursitename.ru в примерах заменяйте на адрес вашего домена

Настройки htaccess по умолчанию

Настройки htaccess по умолчанию

1. Установка главной страницы по умолчанию

DirectoryIndex pagename.html

2. Определение страниц ошибок (error) в .htaccess

ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
ErrorDocument 500 /500.php
Соответственно адрес и название файла могут быть другими, например /error/page404.html

3. Защита от хотлинков
То, что контент с сайтов воруют, это уже давно не новость. Но бывает, что прут вместе с картинками. Вот дабы избежать нагрузки на сервер и раздутия траффика, пишем:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$

#домены, которые могут ссылаться на картинки с вашего сайта
RewriteCond %{HTTP_REFERER} !^http://([ -a-z0-9] \.)?yoursitename\.ru [NC]

#не показывать картинки при хотлинках
RewriteRule \.(gif|jpe?g|png)$ - [F,NC,L]
Если хотите, чтобы на чужом сайте вместо 403 ошибки появлялась определенная картинка, последнюю строку следует заменить на:
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 на сутки
<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>
Параметр max-age приведен в секундах.

6. Включение ошибок на время отладки

php_flag display_errors on

Настройка редиректа с помощью .htaccess

Настройка редиректа с помощью .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
RewriteCond %{REQUEST_URI} !/informpage.html$
RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90
RewriteRule $ http://yoursitename.ru/informpage.html [R=302,L]
Просмотр сайта будет возможен только с вашего ip-адреса - 12.345.678.90

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

Запрет/блокировка с помощью .htaccess

1. Запрет на листинг директории
Используется при отсутствии индексного файла, если хотите запретить просмотр содержимого папки (например, для images):

Options All -Indexes
Обратный код, в смысле разрешение
Options +Indexes

2. Блокировка доступа к файлу
Например, это может быть ваш .htaccess

<Files .htaccess>
order allow,deny
deny from all
</Files>

3. Блокировка доступа к директории
Закрыть доступ только к определенной папке

<Directory /root-access/>
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-адрес:
# Указываем папку, к которой запрещаем доступ по имени и 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
Для запрета доступа к папке сайта используются директивы allow и deny.
Запретить доступ с определенного IP-адреса
#Запрет с 16:18 31-03-2011
Order allow,deny
allow from all
Deny from 198.69.132.24
Закрыть доступ ВСЕМ, кроме определенных IP
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.

Настройка ЧПУ с помощью .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

stop war in Ukraine

ukrTrident

stand with Ukraine