@Bernusha

Насколько правильный .htaccess код и безопасный?

Доброе время суток.
Прописал файл .htaccess и нужно мнение по поводу правильности и корректности кода.
Что добавить, что исправить? Желательно с объяснением или примерами.
Большое спасибо, всем кто отзовется.

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>
  • Вопрос задан
  • 432 просмотра
Решения вопроса 1
@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>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы