Answer the question
In order to leave comments, you need to log in
How correct is the .htaccess code and how secure is it?
Good time of the day.
Registered the .htaccess file and need an opinion about the correctness and correctness of the code.
What to add, what to fix? Preferably with an explanation or examples.
Many thanks to everyone who responds.
DirectoryIndex index.php
# Запрещаем листинг директорий.
Options -indexes
<IfModule mod_rewrite.c>
RewriteEngine On
# Директива включает редиректы.
RewriteBase /
# Без директивы (.*) = /$1 будет /var/wwww/site/web/$1 с директивой = /$1
Options +FollowSymLinks
# Разрешает переход по символическим ссылкам.
php_flag display_errors off
# запретить отображение ошибок (требование монитора качества)
php_flag allow_url_fopen off
# Отключаем вывод информации о сервере.
ServerSignature Off
php_flag expose_php Off
php_value mbstring.func_overload "7"
############################################################################
#### Выбор основного зеркала (без www) ####
############################################################################
# Удалить www
RewriteCond %{ENV:HTTPS} on
# Если включен https
RewriteRule .* - [E=SSL:s]
# То создаем переменную ssl с текстом s
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
# Проверяем, содержит ли домен www в начале URL.
RewriteRule ^(.*)$ http%{ENV:SSL}://%1/$1 [R=301,L]
# Перенаправляем удаляем www
############################################################################
#### Перенаправляем протокол http на https ####
############################################################################
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
# Проверяем наличие https в URL.
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Перенаправляем протокол на http.
#
############################################################################
#### Убираем index.php, если он есть в конце URL ####
############################################################################
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
# URL cодержит index.php в конце.
RewriteCond %{REQUEST_METHOD} =GET
# Выявляем GET запрос в URL (не POST).
RewriteRule ^(.*)$ %1/ [R=301,L]
# Удалить index.php из URL.
############################################################################
#### Убираем повторяющиеся слеши (/) в URL ####
############################################################################
RewriteCond %{THE_REQUEST} //
# Проверяем, повторяется ли слеш (//) более двух раз.
RewriteCond %{QUERY_STRING} !http(s|)://
# Убедимся что это не урл в GET
RewriteRule .* /$0 [R=301,L]
# Исключаем все лишние слеши.
############################################################################
#### Убираем слеши в конце URL для статических файлов (содержит точку) ####
############################################################################
RewriteCond %{REQUEST_URI} \..+$
# Если файл содержит точку.
RewriteCond %{REQUEST_FILENAME} !-d
# И это не директория.
RewriteCond %{REQUEST_FILENAME} -f
# Является файлом.
RewriteCond %{REQUEST_URI} ^(.+)/$
# И в конце URL есть слеш.
RewriteRule ^(.+)/$ /$1 [R=301,L]
# Исключить слеш.
# Страницы сайта
RewriteRule ^blog$ /index/blog/blog? [L]
RewriteRule ^blog/$ /index/blog/blog? [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L]
RewriteCond %{REQUEST_URI} ^/index$ [OR]
RewriteCond %{REQUEST_URI} ^/index[.]+(\w+)$
RewriteRule . / [R=301,L]
# Личеры идут лесом
# https://ru.wikipedia.org/wiki/BitTorrent_(%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB)#%D0%A2%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yapro.ru [NC]
RewriteRule \.(jpg|jpeg|png|gif|ico|css|js)$ - [NC,F,L]
</IfModule>
# ------------------------------------------------------------------------------
# | ERROR |
# ------------------------------------------------------------------------------
ErrorDocument 403 /index/error/403.php
ErrorDocument 404 /index/error/404.php
ErrorDocument 410 /index/error/410.php
ErrorDocument 500 /index/error/500.php
ErrorDocument 505 /index/error/505.php
# ------------------------------------------------------------------------------
# | Изображения с поддержкой CORS |
# ------------------------------------------------------------------------------
# Отправлять заголовок CORS для изображений, когда браузер запрашивает его.
# https://developer.mozilla.org/en/CORS_Enabled_Image
# http://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
# http://hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
<FilesMatch "\.(gif|ico|jpe?g|png|svg|svgz|webp)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>
# ##############################################################################
# # БЕЗОПАСНОСТЬ #
# ##############################################################################
# Закрывает доступ к служебным папкам и файлам, которые начинаются на . или ~.
# Например: факл .htaccess, директория .svn
<IfModule mod_rewrite.c>
RewriteRule (?:^|/)(?:\..*)$ - [F]
</IfModule>
<FilesMatch "(package\.json|gruntfile\.js|gulpfile\.js|bower\.json|composer\.(lock|json)|readme\.md)$">
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
Satisfy All
</IfModule>
# Apache ≥ 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</FilesMatch>
# Защищает важные файлы (по расширению) от получения их содержимого через браузер.
<FilesMatch "(^#.*#|\.(bak|config|dist|fla|in[ci]|log|psd|sh|sql|sw[op]|bat|db)|~)$">
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
Satisfy All
</IfModule>
# Apache ≥ 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</FilesMatch>
# ------------------------------------------------------------------------------
# |Защита часто встречающихcя config и .htaccess |
# ------------------------------------------------------------------------------
<files config.php>
order allow,deny
deny from all
</files>
<Files .htaccess>
order allow,deny
deny from all
</Files>
<Files /library/.htaccess>
order allow,deny
deny from all
</Files>
<Files httpd.conf>
order allow,deny
deny from all
</Files>
<Files php.ini>
order allow,deny
deny from all
</Files>
# Предотвращает частичный листинг файлов.
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
# ------------------------------------------------------------------------------
# |Доступ к веб-шрифтам |
# ------------------------------------------------------------------------------
# Allow access from all domains for web fonts
<IfModule mod_headers.c>
<FilesMatch "\.(eot|font.css|otf|ttc|ttf|woff)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
# Защита от уязвимостей
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]
# Защита HTTP Заголовков
<ifModule mod_headers.c>
Header set X-XSS-Protection "1; mode=block"
# Если нет cloudflare.com открыть
#Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always append X-Frame-Options DENY
Header set X-Content-Type-Options nosniff
Header set X-Permitted-Cross-Domain-Policies "none"
Header set Referrer-Policy "no-referrer"
Header unset X-Powered-by
</IfModule>
# Отключение заголовка ETag
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
# Удаление заголовка Last-Modified
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css)$">
Header unset Last-Modified
</FilesMatch>
# Заперещаем открытие сайта в iframe, на стороннем ресурсе. Тем самым предотвращаем clickjacking.
<IfModule mod_headers.c>
Header set X-Frame-Options "SAMEORIGIN"
<FilesMatch "\.(appcache|atom|crx|css|cur|eot|f4[abpv]|flv|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|tt[cf]|vcf|vtt|webapp|web[mp]|woff|xml|xpi)$">
Header unset X-Frame-Options
</FilesMatch>
</IfModule>
# ------------------------------------------------------------------------------
# | Настройка cookie из фреймов |
# ------------------------------------------------------------------------------
# Разрешить установку куки из iframes в IE.
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
</IfModule>
# Включить протоколирование SSL
<IfModule mod_ssl.c>
ErrorLog /var/log/apache2/ssl_engine.log
LogLevel debug
</IfModule>
Answer the question
In order to leave comments, you need to log in
# ####################################################################################
# # MIME ВИДЫ И КОДИРОВАНИЕ #
# ####################################################################################
# ------------------------------------------------------------------------------
# | Правильные типы MIME для всех файлов |
# ------------------------------------------------------------------------------
<IfModule mod_mime.c>
# Audio
AddType audio/mp4 m4a f4a f4b
AddType audio/ogg oga ogg
# JavaScript
# Normalize to standard type (it's sniffed in IE anyways):
# http://tools.ietf.org/html/rfc4329#section-7.2
AddType application/javascript js jsonp
AddType application/json json
# Video
AddType video/mp4 mp4 m4v f4v f4p
AddType video/ogg ogv
AddType video/webm webm
AddType video/x-flv flv
# Web fonts
AddType application/font-woff woff
AddType application/vnd.ms-fontobject eot
# Browsers usually ignore the font MIME types and sniff the content,
# however, Chrome shows a warning if other MIME types are used for the
# following fonts.
AddType application/x-font-ttf ttc ttf
AddType font/opentype otf
# Make SVGZ fonts work on iPad:
# https://twitter.com/FontSquirrel/status/14855840545
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
# Other
AddType application/octet-stream safariextz
AddType application/x-chrome-extension crx
AddType application/x-opera-extension oex
AddType application/x-shockwave-flash swf
AddType application/x-web-app-manifest+json webapp
AddType application/x-xpinstall xpi
AddType application/xml atom rdf rss xml
AddType image/webp webp
AddType image/x-icon ico
AddType text/cache-manifest appcache manifest
AddType text/vtt vtt
AddType text/x-component htc
AddType text/x-vcard vcf
</IfModule>
# ------------------------------------------------------------------------------
# | Кодировка UTF-8 |
# ------------------------------------------------------------------------------
# Используйте кодировку UTF-8 для всего, что используется как `text / html` или` text / plain`.
AddDefaultCharset utf-8
# Принудительный UTF-8 для определенных форматов файлов.
<IfModule mod_mime.c>
AddCharset utf-8 .atom .css .js .json .rss .vtt .webapp .xml
</IfModule>
# Блокировать доступ к скрытым файлам и каталогам.
# Это включает в себя каталоги, используемые системами контроля версий, такими как Git и SVN.
<IfModule mod_rewrite.c>
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
</IfModule>
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Блокировать доступ к резервным и исходным файлам.
# Эти файлы могут быть оставлены некоторыми текстовыми редакторами и могут обеспечить большую безопасность
# опасность, когда кто-то имеет к ним доступ.
<FilesMatch "(^#.*#|\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|sw[op])|~)$">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
# ####################################################################################
# # WEB PERFORMANCE #
# ####################################################################################
# ------------------------------------------------------------------------------
# | КЕШИРОВАНИЕ И СЖАТИЕ ФАЙЛОВ |
# ------------------------------------------------------------------------------
AddType font/ttf .ttf
AddType font/eot .eot
AddType font/otf .otf
AddType font/woff .woff
<IfModule mod_deflate.c>
# Force compression for mangled headers.
# http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
# Сжать все выходные данные, помеченные одним из следующих MIME-типов
# (для версий Apache ниже 2.3.7 вам не нужно включать `mod_filter`
# и может удалить строки `<IfModule mod_filter.c>` и `</ IfModule>`
# as `AddOutputFilterByType` все еще находится в основных директивах).
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
"application/json" \
"application/ld+json" \
"application/manifest+json" \
"application/rdf+xml" \
"application/rss+xml" \
"application/schema+json" \
"application/vnd.geo+json" \
"application/vnd.ms-fontobject" \
"application/x-font-ttf" \
"application/x-javascript" \
"application/x-web-app-manifest+json" \
"application/xhtml+xml" \
"application/xml" \
"font/eot" \
"font/opentype" \
"image/bmp" \
"image/svg+xml" \
"image/vnd.microsoft.icon" \
"image/x-icon" \
"text/cache-manifest" \
"text/css" \
"text/html" \
"text/javascript" \
"text/plain" \
"text/vcard" \
"text/vnd.rim.location.xloc" \
"text/vtt" \
"text/x-component" \
"text/x-cross-domain-policy" \
"text/xml" \
"font/truetype"
</IfModule>
</IfModule>
# Сжатие файлов стилей (.css) и JavaScript файлов (.js)
<FilesMatch "\.(js|css)$">
SetOutputFilter DEFLATE
</FilesMatch>
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question