Это не мануал, здесь собраны наиболее часто используемые настройки .htaccess, своего рода сборник подсказок.
Для чего нужен .htaccess
.htaccess позволяет создать собственную конфигурацию управлением сервера Апач в директориях или настройках хостинга.
Правила .htaccess распространяются на все директории, где расположен файл, кроме директорий, где расположен собственный .htaccess.
Файл .htaccess считывается сервером Апач при каждом обращении, поэтому все изменения входят в силу сразу, после изменения.
Глобальные настройки сервера Апач могут содержать запрет на исполнение некоторых команд, обычно это вызывает ошибку 500. Также подобную ошибку может вызывать неправильный синтаксис или ошибка, например пропуск пробела.
Запрет доступа для определенных IP-адресов или диапазонов IP-адресов
Запрет доступа с IP-адреса 123.123.123.123.
Order Deny,Allow Deny from 123.123.123.123
Если не указывать последние цифры адреса, то запрет будет распространяться на весь диапазон 123.123.123.0 - 123.123.123.255.
Order Deny,Allow Deny from 123.123.123
Разрешаем доступ только с определенных IP-адресов
Order Deny,Allow Deny from all Allow from 123.123.123.123
Принудительное задание кодировки
AddDefaultCharset UTF-8
Иногда требуется очистка кэша браузера.
Отмена перекодировки сервером
CharsetDisable On
Создание собственных страниц с сообщениями об ошибках
При переходе, например, на несуществующий адрес, посетитель увидит сообщение сервера об ошибке, можно создать собственные страницы ошибок либо перенаправлять посетителя на другой адрес, как главная страница. Но для правильной индексации желательно не перенаправлять, а показывать страницу ошибки.
ErrorDocument 404 http://site.ru/error/404.html ErrorDocument 403 http:// site ru/error/403.html ErrorDocument 401 http:// site.ru/error/401.html ErrorDocument 500 http:// site.ru/error/500.html
Строка ErrorDocument 404 http://site.ru/error/404.html указывает, что при ошибке 404 будет показан файл 404.html, который должен находиться в корне директории сайта. Если файл расположен в другой директории, измените путь к файлу или ссылке.
Редиректы
Редирект на .html
Пример, редирект с c site.ru/blog на site.ru/blog.html.
RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?) RewriteRule .* %1.html [R=301,L] RewriteRule ^(.*)/$ /$1.html [R=301,L]
Редирект на страницу без слеша в конце адреса
Пример, редирект с c site.ru/blog/ на site.ru/blog.
RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)/$ /$1 [R=301,L]
Редирект на страницу со слешем в конце адреса
RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?) RewriteRule .* %1/ [R=301,L]
Редирект на страницу без index.php в адресе
RewriteRule ^index.php/(.*)$ http://mysite.ru/$1 [R=permanent,L]
Редирект на страницу без index.php в конце адреса
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ RewriteRule ^index\.php$ http://site.ru/ [R=301,L]
Редирект с www на без www
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC] RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]
Редирект без www на www
RewriteCond %{HTTP_HOST} ^site.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]
Склейка доменов
Пример, у вас несколько доменов, но посетитель должен переправляться на один.
RewriteCond %{HTTP_HOST} !^site.ru$ RewriteRule ^(.*) http://site.ru/$1 [R=301,L]
Редирект со старых статических url на новые
Пример редирект со страницы http://site.com.ru/id=21.
RewriteCond %{QUERY_STRING} ^id=21$ RewriteRule ^/page.php$ http://site.ru/news.html [L,R=301]
Защита от хотлинка
Если вы хотите запретить вставку изображений с сайта по прямой ссылке.
Вместо site.ru укажите адрес сайта, jpg|jpeg|png|gif - расширение запрещенных изображений, images.jpg – изображение которое будет показываться, если картинка находится не в корне сайта, укажите полный путь.
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?site.ru [NC] RewriteRule \.(jpg|jpeg|png|gif)$ images.jpg [NC,R,L]
Защита от брутофорса
Разрешаем доступ к директории administrator только по протоколу HTTP, что отсеет некоторых ботов. Для каждой CMS нужно указать свой адрес, например wp-login, wp-admin и так далее.
RewriteCond %{REQUEST_URI} ^/administrator\.php$ RewriteCond %{THE_REQUEST} HTTP/1\.0 RewriteRule ^(.*)$ - [F,L]
Бытует легенда, что происхождения названия сервера Апач происходит не от названия индейского племени. Когда сервер был еще в самом начале пути, группа энтузиастов небольшие дополнения к коду, патчи (англ – patch), и «a patchy server» превратилось в Апач, а знаменитое перо на логотипе появилось позже.
В материале перечислены наиболее часто используемые примеры, а большинство возможностей даже не упомянуто, как модуль mod_rewrite, предоставляющий множество возможностей.
Статья писалась эпизодическими «набегами», так что если увидите ошибку, поправьте.
Мой аккаунт на Marketplace - https://timeweb.com/ru/community/marketplace/bashkov-vladislav, обращайтесь
Комментарии
Вот тут:
RewriteCond %{HTTP_HOST} !^site.ru$
RewriteRule ^(.*) http://site.ru/$1 [R=301,L]
Везде пишется протокол http, а если сайт на https? То везде писать https?
Redirect 301 /blog.html https://site.ru/blog
Написал:
RewriteBase /
RewriteCond %{HTTP_HOST} ^en.site.ru$
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/en(?:/|$)
RewriteRule ^(.*)$ en/$1 [L,QSA]
И всё бы ничего, но site.ru/en/smth в урле нормально отдается (как en.site.ru/smth), но по факту информацию не выдает
RewriteCond %{HTTP_HOST} ^sub\site\.ru$
RewriteCond %{REQUEST_URI} !/subdomains/sub/
RewriteRule ^(.*)$ /subdomains/sub/$1 [L]
При открытии sub.site.ru/file или просто самого адреса всё работает правильно, но если открывать sub.site.ru/something/.../file всё превращается в франкенштейна sub.site.ru/subdomains/sub/something/.../file и этим всё портит
Пример:
RewriteCond %{REMOTE_ADDR} !=1.1.1.1|2.2.2.2
Указываю две кондиции тоже не хочет
пример:
RewriteCond %{REMOTE_ADDR} !=1.1.1.1
RewriteCond %{REMOTE_ADDR} !=2.2.2.2
Если кондиция одна с одним IP то все работает
пример:
RewriteCond %{REMOTE_ADDR} !=1.1.1.1
Ip из разных сетей их надо прописать персонально. Куда копать?