Директивы
.htaccess и некоторые рецепты


Что такое .htaccess?

Файл .htaccess содержит директивы конфига вебсервера Apache и помещается в ДОСТУПНЫЙ веб-серверу каталог, к которому он относится. Его действие распространяется И на все каталоги ниже. Самый верхний каталог, в который Вам следует его класть - каталог, в котором лежит корень вашего сайта.

Снижение нагрузки на сервер предупаковкой статики в .gz

По мере роста нагрузки на ваш сайт следует озаботиться уменьшением трафика между сервером и посетителем. Все современные броусеры умеют работать со сжатым GZIP контентом страниц, .css и .js файлов, которые вебсерверы Apache и nginx умеют паковать на лету, что сильно уменьшает трафик между сервером и клиентом, но повышает процессорные затраты на сервере, так как каждый запрос клиента заставляет сервер упаковывать gzip'ом.

Для сайтов и их разделов с редко изменяемым контентом, а также для .css и .js файлов есть решение, позволяющее уменьшить и трафик, и нагрузку на сервер. Надо каждый такой статический файл упаковать в .gz (и получившийся файл положить в тот же каталог, где лежит оригинал), а в .htaccess в корне сайта добавить такие строки:

Решение для Apache c модулем rewrite

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.(html|css|js) $1\.$2\.gz [QSA]

# Prevent double gzip and give the correct mime-type
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.html\.gz$ - [T=text/html,E=no-gzip:1,E=FORCE_GZIP]

Header set Content-Encoding gzip env=FORCE_GZIP
</IfModule>

Снижение нагрузки на сервер и улучшение отношения поисковиков к сайту применением картинок webp

Почти все современные броусеры умеют работать с изображениями в формате .webp, позволяющий добиться от трёх до десятикртаной экономии трафика без снижения качества изображения.

Для каждого файла формата .jpg или .png создаётся файл .webp а в .htaccess в корне сайта добавляем такие строки:

Решение для Apache c модулем rewrite

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTP:Accept} image/webp
RewriteCond %{REQUEST_FILENAME}\.webp -s
RewriteRule ^(.*)\.([pP][nN][gG]|[jJ][pP][eE]?[gG]) $1\.$2\.webp [QSA]

# Prevent double webp and give the correct mime-type
RewriteRule \.[pP][nN][gG]\.webp$ - [T=image/webp]
RewriteRule \.[jJ][pP][gG]\.webp$ - [T=image/webp]
RewriteRule \.[jJ][pP][eE][gG]\.webp$ - [T=image/webp]

</IfModule>

Скрипт на bash с cwebp для создания файлов

#!/usr/local/bin/bash

WebpFix1File(){
[ -z "$1" ] && return
[ -s "$1" ] || return
[ -s "$1.webp" ] && echo -ne "\r- $progress"
[ -s "$1.webp" ] && return
progress=${1:0:60}
len=${#progress}
progress="${progress}                                                                             "
progress=${progress:0:60}

cwebp -q 85 -quiet -exact -o "$1.webp" -- "$1" >/dev/null 2>&1
[ -s "$1.webp" ] || echo -ne "\r# $progress cannot be converted\n"
[ -s "$1.webp" ] || return
size_orig=`stat -f "%z" -- "$1"`
size_webp=`stat -f "%z" -- "$1.webp"`
owners=`stat -f "%u:%g" -- "$1"`
rights=`stat -f "%p" -- "$1"`
rights=${rights:3:3}
if [ "$size_webp" -ge "$size_orig" ]
 then
  rm "$1.webp"
  echo -ne "\r= $progress"
 else
  echo -ne "\r+ $progress"
  chown $owners "$1.webp"
  chmod $rights "$1.webp"
 fi
}

WebpFix1Dir(){
progress=`pwd`
progress=${progress:0:60}
len=${#progress}
progress="${progress}                                                                             "
progress=${progress:0:60}
echo -ne "\r${progress}"
for i in *.png *.PNG *.Png *.PNg *.pNg *.pNG *.pnG *.PnG
    do
    [ -s "$i" ] || continue
    WebpFix1File "$i"
    done

for i in *.jpg *.JPG *.Jpg *.JPg *.jPg *.jPG *.jpG *.JpG
    do
    [ -s "$i" ] || continue
    WebpFix1File "$i"
    done

for i in *.jpeg *.JPeG *.Jpeg *.JPeg *.jPeg *.jPeG *.jpeG *.JpeG
    do
    [ -s "$i" ] || continue
    WebpFix1File "$i"
    done

for i in *.jpEg *.JPEG *.JpEg *.JPEg *.jPEg *.jPEG *.jpEG *.JpEG
    do
    [ -s "$i" ] || continue
    WebpFix1File "$i"
    done

for j in *
    do
    [ -d "$j" ] || continue
    cd -- "$j"
    WebpFix1Dir
    cd ..
    done
}

WebpFix1Dir

for j in *
    do
    [ -d "$j" ] || continue
    cd -- "$j"
    WebpFix1Dir
    cd ..
    done

echo " "

Решение для nginx чуть сложнее

в корневой конфиг nginx добавляем проверку на то, поддерживает ли браусер формат webp:
map $http_accept $webpsupport {
   default 0;
   "~*image/webp,*/*" "1";
   }
А в virtual host'ы nginx - location такого вида, чтобы при наличии .webp файла И поддержке его браусером отдавался .webp файл, а при невыполнении любого из этих двух условий - оригинальный файл:
    location ~* \.([jJ][pP][eE]?[gG]|[pP][nN][gG])$ {
      expires max;
      add_header Pragma public;
      add_header Cache-Control "max-age=31536000, public";
      set $dorewrite 0;
      if (-f $request_filename.webp) {
         set $dorewrite $webpsupport ;
      }
      if ($dorewrite) {
         rewrite ^(.*)\.([jJ][pP][eE]?[gG]|[pP][nN][gG]) $1.$2.webp last;
      }
    }

защита от воровства картинок и файлов

Вы выложили на свой сайт, находящийся на нашем сервере, свои картинки. А потом кто-то на совсем другой странице нарисовал на них ссылку, но не указал, нехороший человек, ссылку на Вас. Тем самым он украл у Вас не сами картинки (понятно, что он мог скачать их себе и положить к себе на сайт). Он украл у нас и у Вас траффик - картинки показал на своём сайте со своего сервера, а сервер нагрузил - наш.

Если Вы заинтересованы в том, чтобы такого не происходило, можете использовать вот такой набор директив в .htaccess:

<IfModule mod_access_referer.c>
 order_referer deny_referer,allow_referer
 allow_referer from gfns.net
 deny_referer from all
 ErrorDocument 403 http://gfns.net/banners/default.gif
</IfModule>

Естественно, вместо gfns.net укажите своё доменное имя.

авторизация



AuthAuthoritative on
AuthName members
AuthType basic
AuthUserFile /home/www/servers/domain/passwd1
Require valid-user

File /home/www/servers/domain/passwd1 may be created with utility htpasswd.exe

кодировка



CharsetSourceEnc koi8-r
CharsetSourceEnc windows-1251

отключение автоперекодировки



CharsetAutoRedirect koi8-r none
CharsetAutoRedirect windows-1251 none
CharsetAutoRedirect ibm866 none
CharsetAutoRedirect iso-8859-5 none
CharsetAutoRedirect x-mac-cyrillic none
CharsetAutoRedirect koi7 none
CharsetAutoRedirect utf-8 none
CharsetNormalizeToUrl none

Если вы желаете большего

Читайте документацию на вебсервер Apache.

[ ]