Коллекция .htaccess сниппетов, собранных в одном месте.
      Дисклеймер: Перед тем, как использовать сниппет в файле
      .htaccess, в большинстве случаев необходимо сделать небольшие
      коррекции (поменять название папки или файла, изменить URL и т.д.).
      Используйте сниппеты на свой страх и риск.
    
ВАЖНО: В Apache 2.4 появилось несколько важных изменений, особенно в конфигурации управления доступами. Чтобы узнать больше об этих и других изменениях перейдите по этой ссылке, а также просмотрите это ишью.
      Что мы делаем? Здесь собраны самые полезные сниппеты для файла
      .htaccess из всего интернета (например, много разных приемов
      из
      Apache Server Configs
      мы собрали в одном месте). Не исключено, что мы могли что-то упустить.
      Если вы заметили где-то ошибки или несоответствия, пожалуйста, сообщите
      нам об этом или сделайте Pull Request. Подробнее о том, как помочь проекту
      и делать Pull Request’ы, вы можете прочитать в
      этой статье на Хабрахабр.
    
      Примечание: Предполагается, что модуль mod_rewrite установлен
      и включен.
    
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]
    RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    Это работает для любого домена. Источник
Это вечная тема для дискуссий - использовать или не использовать www, но если вы поклонник “чистых” доменов, то:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
    RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]
    RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
# Примечание: Рекомендуется включить HTTP Strict Transport Security (HSTS)
# на вашем HTTPS сайте для предотвращения атак посредника (man-in-the-middle).
# https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
    Полезно, если вы имеете прокси перед вашим сервером для TLS.
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
    
      Этот сниппет перенаправляет из пути, который заканчивается на слэш, на
      путь без завершающего слэша (кроме реальных директорий), например, из
      http://www.example.com/blog/ перенаправит на
      http://www.example.com/blog. Это важно для SEO, так как
      рекомендуется, чтобы
      каждая страница имела канонический URL.
    
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]
    
    Redirect 301 /oldpage.html http://www.example.com/newpage.html
Redirect 301 /oldpage2.html http://www.example.com/folder/
    
    RedirectMatch 301 /subdirectory(.*) http://www.newsite.com/newfolder/$1
RedirectMatch 301 ^/(.*).htm$ /$1.html
RedirectMatch 301 ^/200([0-9])/([^01])(.*)$ /$2$3
RedirectMatch 301 ^/category/(.*)$ /$1
RedirectMatch 301 ^/(.*)/htaccesselite-ultimate-htaccess-article.html(.*) /htaccess/htaccess.html
RedirectMatch 301 ^/(.*).html/1/(.*) /$1.html$2
RedirectMatch 301 ^/manual/(.*)$ http://www.php.net/manual/$1
RedirectMatch 301 ^/dreamweaver/(.*)$ /tools/$1
RedirectMatch 301 ^/z/(.*)$ http://static.askapache.com/$1
    
    RewriteEngine On
RewriteRule ^source-directory/(.*) /target-directory/$1 [R=301,L]
    FallbackResource /index.fcgi
    
      В этом примере приведён файл index.fcgi, который лежит в
      каталоге и все запросы к этому каталогу, которые потерпели неудачу из-за
      отсутствия файла/директории будут перенаправлены на скрипт
      index.fcgi. Это хорошо, если вы хотите, чтобы
      baz.foo/some/cool/path обрабатывался скриптом
      baz.foo/index.fcgi (который также поддерживает запросы на
      baz.foo) в тоже время поддерживается
      baz.foo/css/style.css и другое подобное. Узнать истинный путь
      можно из переменной окружения PATH_INFO, которая доступна в скриптах.
    
RewriteEngine On
RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
    
      Это менее эффективная версия директивы
      FallbackResource (поскольку использование
      mod_rewrite сложнее, чем просто обработка директивой
      FallbackResource), но также и более гибкое.
    
Redirect 301 / http://newsite.com/
    
      Этот сайт не “ломает” ссылки. Этот путь
      www.oldsite.com/some/crazy/link.html перенаправит вас на
      www.newsite.com/some/crazy/link.html. Это очень полезно,
      когда вы просто переносите сайт на новый домен.
      Источник
    
      Этот сниппет позволяет использовать “чистые” URL – без расширения .php,
      например, example.com/users вместо
      example.com/users.php.
    
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
    
    ## Apache 2.2
Deny from all
## Apache 2.4
# Require all denied
    Подождите-ка, этот сниппет заблокирует доступ к сайту даже для вас! Сейчас исправим это…
## Apache 2.2
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx
## Apache 2.4
# Require all denied
# Require ip xxx.xxx.xxx.xxx
    
      xxx.xxx.xxx.xxx - это ваш IP. Если вы замените последние три
      цифры, например, на 0/12, этим вы определите диапазон IP
      внутри этой сети и это оградит вас от проблемы перечислять по отдельности
      все разрешённые IP.
      Источник
    
И, естественно, противоположная функция к этой:
## Apache 2.2
Order deny,allow
Deny from xxx.xxx.xxx.xxx
Deny from xxx.xxx.xxx.xxy
## Apache 2.4
# Require all granted
# Require not ip xxx.xxx.xxx.xxx
# Require not ip xxx.xxx.xxx.xxy
    
      Скрытые файлы и директории (те, чьи имена начинаются с точки
      .) должны в большинстве, если не все, быть недоступны для
      других. Например: .htaccess, .htpasswd,
      .git, .hg…
    
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
    Как вариант, вы можете показывать ошибку Not Found (не найдено), чтобы не давать атакующему подсказку:
RedirectMatch 404 /\..*$
    Эти файлы могут быть оставлены некоторыми редакторами text/html (вроде Vi/Vim) и представляют огромную дыру в безопасности, если станут общедоступными.
<FilesMatch "(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
    ## Apache 2.2
    Order allow,deny
    Deny from all
    Satisfy All
    ## Apache 2.4
    # Require all denied
</FilesMatch>
    
    Options All -Indexes
    RewriteEngine on
# Удалите эту строчку, если вы хотите заблокировать пользователя с пустым Referrer
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?example.com [NC]
RewriteRule \.(jpe?g|png|gif|bmp)$ - [NC,F,L]
# Если вы захотите отображать вместо заблокированного изображения свой баннер,
# то замените правило выше на это:
# RewriteRule \.(jpe?g|png|gif|bmp) http://example.com/blocked.png [R,L]
    Иногда вам потребуется запретить хотлинкинг только для некоторых доменов.
RewriteEngine on
RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?badsite\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?badsite2\.com [NC,OR]
RewriteRule \.(jpe?g|png|gif|bmp)$ - [NC,F,L]
# Если вы захотите отображать вместо заблокированного изображения свой баннер,
# то замените правило выше на это:
# RewriteRule \.(jpe?g|png|gif|bmp) http://example.com/blocked.png [R,L]
    
      Сначала нужно создать файл .htpasswd в определенной
      директории:
    
И потом использовать этот файл для аутентификации:
AuthType Basic
AuthName "One does not simply"
AuthUserFile /home/fellowship/.htpasswd
Require valid-user
    AuthName "One still does not simply"
AuthType Basic
AuthUserFile /home/fellowship/.htpasswd
<Files "one-ring.o">
Require valid-user
</Files>
<FilesMatch ^((one|two|three)-rings?\.o)$>
Require valid-user
</FilesMatch>
    Блокирует доступ для всех пользователей, которые пришли (были перенаправлены) из определенного домена(-ов). Источник
RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} somedomain\.com [NC,OR]
RewriteCond %{HTTP_REFERER} anotherdomain\.com
RewriteRule .* - [F]
    
      Этот сниппет запрещает отображение сайта во фрейме (например, в теге
      iframe), но разрешает отображение сайта во фрейме для
      определенных URI.
    
SetEnvIf Request_URI "/starry-night" allow_framing=true
Header set X-Frame-Options SAMEORIGIN env=!allow_framing
    <IfModule mod_deflate.c>
    # Принудительное сжатие для исковерканных заголовков.
    # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
    <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>`
    # так как `AddOutputFilterByType` все еще есть в ядре Apache).
    <IfModule mod_filter.c>
        AddOutputFilterByType DEFLATE application/atom+xml \
                                      application/javascript \
                                      application/json \
                                      application/rss+xml \
                                      application/vnd.ms-fontobject \
                                      application/x-font-ttf \
                                      application/x-web-app-manifest+json \
                                      application/xhtml+xml \
                                      application/xml \
                                      font/opentype \
                                      image/svg+xml \
                                      image/x-icon \
                                      text/css \
                                      text/html \
                                      text/plain \
                                      text/x-component \
                                      text/xml
    </IfModule>
</IfModule>
    
    
      Expires headers говорят браузеру, должен ли он загружать файл из
      сервера или же из кэша. Для статичного контента рекомендуется установить
      Expires заголовки на что-нибудь далекое в будущем.
    
Если вы не контролируете изменение версий с помощью перебора, основанного на файлах, подумайте о том, чтобы уменьшить время кэша для CSS и JS, например, до 1 недели. Источник
<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault                                      "access plus 1 month"
  # CSS
    ExpiresByType text/css                              "access plus 1 year"
  # Данные
    ExpiresByType application/json                      "access plus 0 seconds"
    ExpiresByType application/xml                       "access plus 0 seconds"
    ExpiresByType text/xml                              "access plus 0 seconds"
  # Favicon
    ExpiresByType image/x-icon                          "access plus 1 week"
  # HTML компоненты (HTCs)
    ExpiresByType text/x-component                      "access plus 1 month"
  # HTML
    ExpiresByType text/html                             "access plus 0 seconds"
  # JavaScript
    ExpiresByType application/javascript                "access plus 1 year"
  # Файлы манифеста (Manifest)
    ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
    ExpiresByType text/cache-manifest                   "access plus 0 seconds"
  # Медиа
    ExpiresByType audio/ogg                             "access plus 1 month"
    ExpiresByType image/gif                             "access plus 1 month"
    ExpiresByType image/jpeg                            "access plus 1 month"
    ExpiresByType image/png                             "access plus 1 month"
    ExpiresByType video/mp4                             "access plus 1 month"
    ExpiresByType video/ogg                             "access plus 1 month"
    ExpiresByType video/webm                            "access plus 1 month"
  # Фиды
    ExpiresByType application/atom+xml                  "access plus 1 hour"
    ExpiresByType application/rss+xml                   "access plus 1 hour"
  # Web шрифты
    ExpiresByType application/font-woff2                "access plus 1 month"
    ExpiresByType application/font-woff                 "access plus 1 month"
    ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
    ExpiresByType application/x-font-ttf                "access plus 1 month"
    ExpiresByType font/opentype                         "access plus 1 month"
    ExpiresByType image/svg+xml                         "access plus 1 month"
</IfModule>
    
      Удаляя заголовок ETag, вы выключаете кэш и избавляете
      возможности проверять браузером файлы, следовательно они будут полагаться
      на заголовки Cache-Control и Expires.
      Источник
    
<IfModule mod_headers.c>
    Header unset ETag
</IfModule>
FileETag None
    php_value <key> <val>
# Например:
php_value upload_max_filesize 50M
php_value max_execution_time 240
    ErrorDocument 500 "Хьюстон, у нас проблемы."
ErrorDocument 401 http://error.example.com/mordor.html
ErrorDocument 404 /errors/halflife3.html
    Иногда нужно загрузить запрашиваемый файл, а не отображать его в браузере.
<Files *.md>
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</Files>
    А ниже сниппет, который делает это с точностью до наоборот:
Иногда нужно отобразить запрашиваемый файл в браузере, а не загружать его.
<FilesMatch "\.(tex|log|aux)$">
    Header set Content-Type text/plain
</FilesMatch>
    Шрифты, которые хранятся на CDN серверах, могут не работать в Firefox и IE из-за CORS. Данный сниппет решает эту проблему.
<IfModule mod_headers.c>
    <FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
        Header set Access-Control-Allow-Origin "*"
    </FilesMatch>
</IfModule>
    
    Ваш текстовый контент должен быть всегда закодирован в UTF-8, не так ли?
# Используйте кодировку UTF-8 для обработки text/plain или text/html
AddDefaultCharset utf-8
# Принудительное использование UTF-8 для различных файлов
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
    
    Если вы используете шаред хостинг, вполне вероятно, что там установлено несколько версий PHP. Но вам нужна конкретная версия PHP для вашего веб-сайта. Этот сниппет должен переключить PHP версию.
AddHandler application/x-httpd-php56 .php
# В качестве альтернативы вы можете использовать AddType
AddType application/x-httpd-php56 .php
    Просмотр в режиме совместимости в IE может оказать влияние на то, как отображаются некоторые сайты. Этот сниппет заставляет IE использовать движок Edge Rendering и выключает просмотр в режиме совместимости.
<IfModule mod_headers.c>
    BrowserMatch MSIE is-msie
    Header set X-UA-Compatible IE=edge env=is-msie
</IfModule>
    Если WebP изображения поддерживаюся и изображения с расширениями .webp и теми же именами найдены в том же месте, где и изображения jpg/png, которые нужно отправить, то тогда вместо них отправляются изображения WebP.
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]