B
B
Bernusha2019-05-16 13:04:59
Apache HTTP Server
Bernusha, 2019-05-16 13:04:59

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

1 answer(s)
B
Bernusha, 2019-05-16
@Bernusha

# ####################################################################################
# # 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 question

Ask a Question

731 491 924 answers to any question