Включение поддержки файла .htaccess
Параметр,опредлеяющий имя файла .htaccess в конфигурационном файле Apache
AccessFileName
Например, для Debian/Ubuntu
1 |
# nano /etc/apache2/apache2.conf |
1 |
AccessFileName .htaccess |
Включение поддержки файла .htaccess возможно
Либо в конфигурационном файле Apache – глобально для каталога, внутри которого размещаются все сайты.
Например, для Debian/Ubuntu
1 |
# nano /etc/apache2/apache2.conf |
1 2 3 4 |
<Directory /var/www/> AllowOverride All ……… </Directory> |
Либо в конфигурацаионном файле конкретного виртуального хоста Apache
(что более предпочтительно)
Например, для Debian/Ubuntu
1 |
# nano /etc/apache2/sites-enabled/mysite.conf |
1 2 3 4 |
<Directory "/var/www/mysite"> AllowOverride All …………………… </Directory> |
Сама директива AllowOverride определяет директивы, разрешенные для использования в файле .htaccess.
Установим ее значение в All для возможности переопределения всех поддерживаемых параметров
Файл .htaccess необходимо создавать именно в том каталоге, в котором планируется применять настройки.
Настройки в файле .htaccess будут действовать также и на все подкаталоги.
В каждом подкаталоге может быть свой файл .htaccess, в котором можно переопределить настройки, указанные в файле .htaccess на верхних уровнях
Проверка синтаксиса и перезапуск Apache
1 |
# apache2ctl configtest && service apache2 restart |
1.Ограничение доступа к файлу/файлам/каталогам(необходимо включить модуль auth_basic_module)
Создание внутри каталога, к которому необходимо ограничить доступ, файла .htaccess с одним из указанных ниже содержимым
a)По логину/паролю
1 2 3 4 |
AuthName "Restricted area" AuthType Basic AuthUserFile /var/www/.htpasswd Require valid-user |
Создание файла с логином/паролем
1 |
# htpasswd -c /var/www/.htpasswd username |
Добавление нового пользователя
1 |
# htpasswd /var/www/.htpasswd username2 |
Удалить пользователя можно просто редактированием файла .htpasswd, удалив строку с его логином и хешем пароля.
Отредактировать пароль – так же, как создавался пользователь(но без опции -с)
Если необходимо предоставить доступ определенным пользователям, а не всем пользователям в файле .htpasswd, то вместо
1 |
Require valid-user |
Используем/указываем конкретные имена пользователей через пробел
1 |
Require username username2 |
Если необходимо дать доступ нескольким пользователям, то можно использовать группы
Пользователи добавляются в группы и доступ разрешается группам
Например, предоставим доступ пользователям (admin1 и user1), состоящих в группах admins и users
1 2 3 4 5 |
AuthName "Restricted area" AuthType Basic AuthUserFile /var/www/.htpasswd AuthGroupFile /var/www/.htgroup Require group admins users |
1 |
# cat /var/www/.htgroup |
1 2 |
admin: admin1 user: user1 |
Создадим пользователей admin1 и users1
1 |
# htpasswd -c /var/www/.htpasswd admin1 |
1 |
# htpasswd /var/www/.htpasswd user1 |
b)По IP-адресам
В зависимости от того в каком порядке указаны директивы меняется логика работы сервера. В случае если Deny,Allow то запрещается доступ со всех IP кроме оговоренных
В случае если Allow,Deny разрешается доступ со всех IP кроме оговоренных.
Далее должны идти секции описания для доступа и запрета. Ключевое слово all означает со всех IP
Запретить доступ для всех, кроме указанных адресов/подсетей
1 2 3 4 |
Order deny,allow Deny from all Allow from 127.0.0.1 77.120.XXX.YYY/24 Allow from 159.224.XXX.YYY |
Запретить доступ с конкретных адресов/подсетей
1 2 3 4 |
Order allow,deny Allow from all Deny from 127.0.0.1 77.120.XXX.YYY/24 Deny from 159.224.XXX.YYY |
Директива Satisfy определяет способ взаимодействия директив идентификации (используемые для защиты паролем) с директивами доступа (например, Allow/Deny).
С ее помощью вы, например, можете заставить Apache выполнять те запросы, которые удовлетворяют только требованиям идентификации, либо только требованиям доступа.
Или вы можете сделать, чтобы запрос удовлетворял всем требованиям.
Директива Satisfy принимает два значения:
1 |
Satisfy Any |
Пропускает запрос, если выполнено ЛЮБОЕ из требований (идентификация или проверка доступа)
1 |
Satisfy All |
Пропускает запрос, только если ОБА требования выполнены (и идентификация и проверка доступа).
Разрешить доступ либо по логину/паролю ИЛИ с указанных IP-адресов(для доступа достаточно выполнения ОДНОГО ИЗ УСЛОВИЙ (либо первого условия(логина/пароля) либо второго условия(указанного IP-адреса))
1 2 3 4 5 6 7 8 9 |
AuthName "Restricted area" AuthType Basic AuthUserFile /var/www/.htpasswd Require valid-user Order deny,allow Deny from all Allow from 127.0.0.1 77.120.XXX.YYY/24 Allow from 159.224.XXX.YYY Satisfy Any |
Разрешить доступ либо по логину/паролю И с указанных IP-адресов(для доступа требуется выполнение ОБОИХ УСЛОВИЙ( как логина/пароля так и с указанного IP-адреса)
1 2 3 4 5 6 7 8 9 |
AuthName "Restricted area" AuthType Basic AuthUserFile /var/www/.htpasswd Require valid-user Order deny,allow Deny from all Allow from 127.0.0.1 77.120.XXX.YYY/24 Allow from 159.224.XXX.YYY Satisfy All |
Аналогично все выше указанные условия можно применить как для всех файлов, так и для одного или множества файлов
Например, запретить достyп для всех файлов с указанным расширением
1 2 3 4 |
<FilesMatch "\.(htaccess|htpasswd|png|php)$"> Order Allow, Deny Deny from All </FilesMatch> |
Запретить доступ к одному файлу
1 2 3 4 |
<files adminer.php > Order Allow, Deny Deny from All </files |
2. Определение опций PHP
Для работы с PHP в конфигурационных файлах Apache доступны 4 директивы:
1 |
php_value, php_flag, php_admin_value, php_admin_flag |
которые отличаются значимостью, типом устанавливаемых значений и местом применения.
Директивы
1 |
php_admin_value, php_admin_flag |
выставляются только в глобальном конфигурационном файле Apache и не могут задаваться через файл .htaccess. По сути, данные директивы переопределяют значение остальных директив.
Директива php_flag служит для установки логических значений директив в php.ini, в то время как директива php_value служит для установки строковых и числовых значений директив php.ini, т.е. любых типов значений, за исключением логических.
Директивы php_flag и php_value могут быть установлны в файле .htaccess
Синтаксис директив
1 2 |
php_flag имя директивы on | off php_value имя директивы VALUE |
Определение параметров для
максимального размера закачиваемого файла(upload_max_filesize),
максимально допустимого размера данных, отправляемых методом POST(post_max_size),
максимального времени в секундах выполнения скрипта(max_execution_time), максимальное время в секундах, в течение которого скрипт должен разобрать все входные данные, переданные запросами вроде POST или GET(max_input_time),
максимальный объем памяти , который может использовать скрипт(memory_limit),
максимальный размер передаваемых переменных(max_input_vars)
1 2 3 4 5 6 |
php_value upload_max_filesize 128M php_value post_max_size 128M php_value max_execution_time 300 php_value max_input_time 600 php_value memory_limit 256M php_value max_input_vars 15000 |
Включение отображения ошибок
1 2 3 4 |
php_flag display_errors on php_value error_reporting -1 php_flag display_startup_errors on php_flag html_errors on |
Запрет выполнения php-скриптов в текущей директории
1 |
php_flag engine off |
3.Перенаправления (требуется включения модуля mod_rewrite)
Перенаправление со старого домена на новый
1 2 |
RewriteEngine On RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L] |
Перенаправление домена без www на с www
Для любого домена
1 2 3 |
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] |
Для домена example.com
1 2 3 |
RewriteEngine On RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] |
Перенаправление домена с www на без www
Для любого домена
1 2 3 |
RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L] |
Для домена example.com
1 2 3 |
RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.example\.com [NC] RewriteRule (.*) http://example.com/$1 [R=301,L] |
Постоянное перенаправление с example.com на domain.com
1 2 3 |
RewriteEngine On RewriteCond %{HTTP_HOST} example.com RewriteRule (.*) http://domain.com /$1 [R=301,L] |
Временное перенаправление с example.com на domain.com
1 2 3 |
RewriteEngine On RewriteCond %{HTTP_HOST} example.com RewriteRule (.*) http://domain.com /$1 [R=302,L] |
Постоянное перенаправление домена example.com и домена www.example.com на домен domain.com
1 2 3 4 |
RewriteEngine On RewriteCond %{HTTP_HOST} ^example\.com$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.com$ RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L] |
Перенаправление с HTTP на HTTPS для домена example.com
1 2 3 4 5 |
RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteCond %{HTTP_HOST} ^example\.com$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.com$ RewriteRule ^(.*)$ https://www.example.com/$1 [R,L] |
Либо
1 2 3 |
RewriteEngine On RewriteCond %{HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} |
Тестирование пернеправлений
htaccess tester
http://htaccess.madewithlove.be
Блокировка посетителей, перешедших с определенного домена
Пользователей с нежелательных ресурсов будут перенаправены на страницу 403 Forbidden
Вам необходимо заменить bannedurl1.com и bannedurl2.com доменами, которые вы хотите внести в черный список. Вы можете использовать флаг [NC], указывающий, что введенное доменное имя нечувствительно к регистру. Флаг [F] указывает на тип действия, в данном случае — отображение ошибки 403 Forbidden. Если вы хотите запретить несколько сайтов, используйте флаги [NC, OR] для каждого домена, если же вы хотите запретить использование одного домена — используйте только флаг [NC].
1 2 3 4 |
RewriteEngine on RewriteCond %{HTTP_REFERER} bannedurl1.com [NC,OR] RewriteCond %{HTTP_REFERER} bannedurl2.com [NC,OR] RewriteRule .* - [F] |
4. Защита сайта от вставки изображений с других ресурсов(HotLink)
1 2 3 4 |
RewriteEngine ON RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERERER} !^http://(www\.)?mydomain.com/.*$ [NC] RewriteRule \.(gif|jpeg|jpg|png)$ - [NC,F,L] |
5.Переопределение индексного файла
Позволяет изменить страницу, которая будет показываться при обращении к директории
1 |
DirectoryIndex index.php index.html myindex.php |
6.Включение GZIP-сжатия (требуется установленный модуль mod_deflate)
Сжатие передаваемых файлов. Данное сжатие положительно влияет на передаваемый трафик (снижая его количество) и как результат, повышается скорость работы сайта в целом, но приводит к большей нагрузке на процессор сервера.
1 2 3 4 5 6 7 8 9 10 11 |
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript </IfModule> |
Проверка поддержки сжатия
http://www.whatsmyip.org/http-compression-test
http://highloadtools.com/gzip
7. Включение/отключение кеша, установка срока жизни в заголовках (требуются установленные модули mod_expires, mod_headers)
Позволяет увеличить скорость загрузки сайта, при его повторном посещение потому, что браузер сохранить все схожие элементы на компьютер и при повторной загрузке сайта, будет обращаться к компьютеру, а не к серверу.
Например, укажем срок кеширования, это «access plus». При необходимости, можно установить более длительный срок действия. Также разрешается выставлять кэширование по последнему изменению в файле(modification plus) или по времени последнего доступа клиента.
Файлы с указанным расширением будут кешироваться браузером клиента на 30 дней со дня обращения к файлу на сайте.
1 2 3 4 5 6 7 8 9 |
<IfModule mod_expires.c> ExpiresActive On ExpiresByType application/javascript "access plus 30 days" ExpiresByType text/javascript "access plus 30 days" ExpiresByType text/css "access plus 30 days" ExpiresByType image/gif "access plus 30 days" ExpiresByType image/jpeg "access plus 30 days" ExpiresByType image/png "access plus 30 days" </IfModule> |
Файлы с расширением .(ico|png|jpeg|svg|ttf) будут кешироваться на 1 час(3600 секунд), а файлы с расширением .(js|css) до указанной даты
1 2 3 4 5 6 7 |
<FilesMatch "\.(ico|png|jpeg|svg|ttf)$> Header Set Cache-Control "max-age=3600, public" </FilesMatch> <FilesMatch "\.(js|css)$"> Header Set Cache-Control "public" Header Set Expires "Sat, 24 Jun 2017 16:00:00 GMT+2" </FilesMatch> |
Отключение кеширования файлов с указанным разрешением
1 2 3 |
<FilesMatch ".(pl|php|cgi|spl|scgi|fcgi)$"> Header unset Cache-Control </FilesMatch> |
Проверка включения кеширования и установки срока жизни в заголовках можно через расширение Firebug либо интсрументы Веб-разработки в Mozilla/Google Chrome
8. Изменение интерпретатора, который обрабатывает файлы/скрипты
Выполнение скриптов (Perl(.pl), PHP(.php), Python(.py)) как текстовых файлов(только отображать содержимое файла) , а не как cgi-скриптов
1 2 |
RemoveHandler cgi-script .php .pl .py AddType text/plain .php .pl .py |
Установка обработки .html и .htm файлов php-интерпретатором и убрать с обработки как файлов с гипертекстовой разметкой
1 2 |
RemoveHandler .html .htm AddType application/x-httpd-php .php .htm .html .phtml |
9.Разрешить выполнение CGI-скриптов за пределами cgi-bin каталога
В каталоге, в которой должны выполняться скрипты CGI, создайте файл .htaccess
1 2 |
AddHandler cgi-script .cgi Options +ExecCGI |
10.Запрет и разрешение выдачи листинга(списка каталогов/файлов)
По умолчанию включена директива
1 |
Options -Indexes |
и в случае отсутствия индексной страницы ответ сервера выдаст HTTP ошибку 403
При необходимости вывода списка каталогов/файлов при отсутствии индексной страницы используем директиву
1 |
Options +Indexes |
Разрешить просматривать список файлов, но при этом чаcть файлов определенного формата не отображается
Выдается листинг каталога, т.е. его содержание со всем содержанием, за исключением файлов-скриптов PHP и Perl.
1 |
IndexIgnore *.php* *.pl |
11.Блокировка запросов с нежелательных User Agents
1 2 3 4 5 6 7 8 9 10 |
SetEnvIfNoCase user-Agent ^FrontPage [NC,OR] SetEnvIfNoCase user-Agent ^Java.* [NC,OR] SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR] SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR] SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR] SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR] SetEnvIfNoCase user-Agent ^Zeus [NC] Order Allow,Deny Allow from all Deny from env=bad_bot |
Список User Agent браузеров, роботов и пауков поисковых машин, веб-каталогов, менеджеров закачек, спам-ботов и плохих ботов можно найти на сайте http://www.user-agents.org
12. Создание собственных страниц ошибок
Необходимо создать в корневом каталоге сайта каталог «error» и разместить в нем соответствующие файлы.
1 2 3 4 |
ErrorDocument 401 /error/401.php ErrorDocument 403 /error/403.php ErrorDocument 404 /error/404.php ErrorDocument 500 /error/500.php |
13.Смена кодировки(таблицы символов) по умолчанию
Иногда браузер пользователя не может корректно определить тип кодировки выдаваемого документа.
Например, допустимая кодировка для сайта это UTF-8, браузер же выбирает кодировку windows-1251 для чтения открываемых сайтов в результате чего браузер из-за неправильной кодировки выдает пользователю информацию в виде нечитабельных символов.
Для принудительной установки кодировки UTF-8
1 |
AddDefaultCharset UTF-8 |
Если,например, необходимо принудительно установить кодировку windows-1251, то используем
1 |
AddDefaultCharset WINDOWS-1251 |
14. Обход диалога загрузки
По умолчанию при попытке загрузить файл с веб-сервера отображается диалог, который спрашивает вас, хотите ли вы сохранить файл или открыть его. Если файлы, которые вы загрузили на сервер, предназначены исключительно для скачивания установите загрузку действием по умолчанию тем самым запретив пользователю воспроизодить этот файл на сервере.
1 2 3 |
AddType application/octet-stream .pdf AddType application/octet-stream .zip AddType application/octet-stream .mp3 |
Либо
1 |
AddType application/octet-stream .pdf .zip .mp3 |
15.Включение страницы обслуживания
1 2 3 4 |
RewriteEngine on RewriteCond %{REQUEST_URI} !/maintenance.html$ RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123 RewriteRule $ /maintenance.html [R=302,L] |
Источник:
http://www.linuxrsp.ru/artic/25_htaccess_rules.html
https://habrahabr.ru/post/165701
https://www.tecmint.com/apache-htaccess-tricks
https://masterhost.ru/support/doc/apache/
https://beget.com/ru/articles/htaccess#mod_rewrite