Основы.htaccess на примерах

http://evolt.org/ultimate_htaccess_examples
  • Перевод
В данной статье приведены реальные примеры кода, который автор использует, разрабатывая сайты для своих клиентов. Уровень — чуть выше начального. Предлагаю вашему вниманию выдержки из статьи. Возможны неточности в переводе, если поправите — буду признательна. Если кому-то поможет — буду рада.
Поделиться публикацией

Комментарии 26

    +2
    Статьи не видно.
      +1
      Читай между строк... =)))
      0
      Между метками надо ставить запятые. И статьи не видно пока...
        +9
        Приведенный ниже код позволяет поисковым роботам (в данном случае, googlebot) просматривать страницу и делает так, чтобы я, с моего IP, мог входить на сайт без пароля, а мой клиент и посетители – по паролю. Также данным кодом разрешено проведение XHTML и CSS валидации! (w3.org)

        AuthName "SiteName Administration"
        AuthUserFile /home/sitename.com/.htpasswd
        AuthType basic
        Require valid-user
        Order deny,allow
        Deny from all
        Allow from 24\\.205\\.23\\.222
        Allow from w3.org htmlhelp.com
        Allow from googlebot.com
        Satisfy Any

        Каждый образец кода скопирован с форума htaccessElite. Там же можно найти дополнительную информацию по каждому из образцов.
        NB!: Большинство приведенных примеров можно использовать с директивой Files or Filesmatch, чтобы инструкции, содержащиеся в них, применялись только к конкретным файлам.
        NB!: Инструкции, направленные на переопределение (rewrite) должны всегда предваряться следующими строками:

        Options +FollowSymLinks
        RewriteEngine On
        RewriteBase /

        Чтобы присвоить файлу тип независимо от его имени или расширения

        #Делает так, что файлы, напр., image.gif, blah.html, index.cgi исполняются как php
        ForceType application/x-httpd-php

        Чтобы переадресовать запросы, созданные не по https протоколу на https, и решить проблему необходимости повторной авторизации при использовании htpasswd

        SSLOptions +StrictRequire
        SSLRequireSSL
        SSLRequire %{HTTP_HOST} eq "google.com"
        ErrorDocument 403 https://google.com

        Редирект с битых ссылок, не вредящий SEO
        Для одного удаленного файла

        Redirect 301 /d/file.html http://www.htaccesselite.com/r/file.html

        Для группы файлов типа blog/this.php?gh
        RedirectMatch 301 /blog(.*) http://www.askapache.com/$1

        При смене доменного имени

        Redirect 301 / http://www.newdomain.com
        Обязательное www в запросе
        Options +FollowSymLinks
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_URI} !^/robots\\.txt$
        RewriteCond %{HTTP_HOST} !^www\\.example\\.com$ [NC]
        RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

        Необязательное www в запросе

        Options +FollowSymLinks
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_URI} !^/robots\\.txt$ [NC]
        RewriteCond %{HTTP_HOST} !^www\\.[a-z-]+\\.[a-z]{2,6} [NC]
        RewriteCond %{HTTP_HOST} ([a-z-]+\\.[a-z]{2,6})$ [NC]
        RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]

        Убираем субдомен из строки запроса

        Options +FollowSymLinks
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_URI} !^/robots\\.txt$
        RewriteCond %{HTTP_HOST} \\.([a-z-]+\\.[a-z]{2,6})$ [NC]
        RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]

        Убираем субдомен из строки запроса

        Options +FollowSymLinks
        RewriteEngine On
        RewriteBase /
        RewriteCond %{HTTP_HOST} \\.([^\\.]+\\.[^\\.0-9]+)$
        RewriteCond %{REQUEST_URI} !^/robots\\.txt$ [NC]
        RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

        Перенаправление всех посетителей на другой сайт, за исключением одного IP (бывает полезно при веб-разработке)

        ErrorDocument 403 http://www.someothersite.com
        Order deny,allow
        Deny from all
        Allow from 24.33.65.6

        Операции над переменными (mod_env)
        Установка часового пояса сервера:

        SetEnv TZ America/Indianapolis

        Установка email администратора сервера:

        SetEnv SERVER_ADMIN webmaste@htaccesselite.com

        Выключение ServerSignature
        ServerSignature Off
        Добавление языка и кодировки в заголовки без использования мета-тэгов
        AddDefaultCharset UTF-8
        # Или AddType 'text/html; charset=UTF-8' html
        DefaultLanguage en-US

        C использованием директивы Files

        AddDefaultCharset UTF-8
        DefaultLanguage en-US

        C использованием директивы FilesMatch (более предпочтительно)

        AddDefaultCharset UTF-8
        DefaultLanguage en-US

        Использование собственного файла php.ini с помощью mod_php или php, установленного как cgi
        Статья на тему: Custom PHP.ini tips and tricks
        Если php работает как модуль Apache (mod_php) в корневом файле .htaccess установите следующее:
        SetEnv PHPRC /location/todir/containing/phpinifile
        Если php установлен как cgi, поместите Ваш файл php.ini в директорию, содержащую php, в описываемом случае /cgi-bin/, а в файл htaccess добавьте следующее:
        AddHandler php-cgi .php .htm Action php-cgi /cgi-bin/php5.cgi
        Если cgi-php работет через оболочку (для FastCGI), необходимо в скрипте оболочки изменить #!/bin/sh export PHP_FCGI_CHILDREN=3 exec /user3/x.com/htdocs/cgi-bin/php5.cgi на следующее #!/bin/sh export PHP_FCGI_CHILDREN=3 exec /x.com/cgi-bin/php.cgi -c /abs/path/to/php.ini
        Безопасность папок: Удаление возможности исполнять скрипты
        Это можно сделать несколькими способами. К примеру:
        AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
        Options -ExecCGI

        Таким образом Вы определите, что файлы с перечисленными расширениями попадают в сферу действия команды -ExecCGI, а значит и -FollowSymLinks
        Разрешение только методов GET и PUT при обращении к серверу.
        Options -ExecCGI -Indexes -All +FollowSymLinks
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_METHOD} !^(GET|PUT)
        RewriteRule .* - [F]
        Обработка всех файлов gif скриптом cgi
        Action image/gif /cgi-bin/filter.cgi

        Обработка запроса / файла в зависимости от метода
        Script PUT /cgi-bin/upload.cgi
        Форсированная загрузка файла вместо отображения его содержимого прямо в браузере
        AddType application/octet-stream .avi
        AddType application/octet-stream .mpg

        А в HTML-коде достаточно поставить ссылку прямо на нужный файл.
        Отображение исходного кода вместо выполнения скрипта
        Если возникла необходимость отобразить файлы типа .pl, .py или .cgi в виде исходного кода, а не исполнять их как скрипты, создайте в папке, где они расположены, файл .htaccess, содержащий следующее:
        RemoveHandler cgi-script .pl .py .cgi
        Многократное увеличение скорости работы сайта при помощи кэширования!
        Статья на тему: Speed Up Sites with htaccess Caching

        # НА МЕСЯЦ

        Header set Cache-Control "max-age=2592000"

        # НА НЕДЕЛЮ

        Header set Cache-Control "max-age=604800"

        # НА ДЕНЬ

        Header set Cache-Control "max-age=43200"

        Предотвращение кражи изображений и файлов

        Options +FollowSymLinks
        RewriteEngine On
        RewriteBase /
        RewriteCond %{HTTP_REFERER} !^$
        RewriteCond %{HTTP_REFERER} !^http://(www\\.)?askapache.com/.*$ [NC]
        RewriteRule \\.(gif|jpg|swf|flv|png)$ http://www.askapache.com/evil-hotlinker.… [R=302,L]

        Замена стандартных сообщений об ошибке

        ErrorDocument 404 /favicon.ico
        ErrorDocument 403 https://secure.htaccesselite.com
        ErrorDocument 404 /cgi-bin/error.php
        ErrorDocument 400 /cgi-bin/error.php
        ErrorDocument 401 /cgi-bin/error.php
        ErrorDocument 403 /cgi-bin/error.php
        ErrorDocument 405 /cgi-bin/error.php
        ErrorDocument 406 /cgi-bin/error.php
        ErrorDocument 409 /cgi-bin/error.php
        ErrorDocument 413 /cgi-bin/error.php
        ErrorDocument 414 /cgi-bin/error.php
        ErrorDocument 500 /cgi-bin/error.php
        ErrorDocument 501 /cgi-bin/error.php

        NB!: Вы можете также использовать внешние ссылки, но не делайте внешних ссылок на Ваш собственный сайт, чтобы не вредить его продвижению в поисковых системах.
        Операция аутентификации
        Запрос пароля на один файл:


        AuthName "Prompt"
        AuthType Basic
        AuthUserFile /home/askapache.com/.htpasswd
        Require valid-user

        Защита паролем нескольких файлов:

        AuthName "Development"
        AuthUserFile /.htpasswd
        AuthType basic
        Require valid-user

        Примеры использования директивы Allow:

        # Частичное разрешение (доменное имя)
        Allow from 10.1.0.0/255.255.0.0

        # Полное разрешение на 1 IP
        Allow from 10.1.2.3

        # Полное разрешение на несколько IP
        Allow from 192.168.1.104 192.168.1.205

        # Разрешение при совпадении части IP адреса с образцом
        Allow from 10.1
        Allow from 10 172.20 192.168.2

        # разрешение для пары сеть/маска подсети
        Allow from 10.1.0.0/255.255.0.0


        Использование переменных окружения в зависимости от посетителя:

        SetEnvIf User-Agent ^KnockKnock/2\\.0 let_me_in
        Order Deny,Allow
        Deny from all
        Allow from env=let_me_in
        Разрешение для домена (при запрете для субдомена)
        Order Allow,Deny
        Allow from apache.org
        Deny from foo.apache.org
        Доступ с IP адреса без пароля, а не с IP – по паролю
        AuthUserFile /home/www/site1-passwd
        AuthType Basic
        AuthName MySite
        Require valid-user
        Allow from 172.17.10
        Satisfy Any

        Блокирование доступа к файлам в определенные часы
        Options +FollowSymLinks
        RewriteEngine On
        RewriteBase /
        # В 16 часов закрыть доступ к файлам
        RewriteCond %{TIME_HOUR} ^16$
        RewriteRule ^.*$ - [F,L]

        Пример базового файла .htaccess
        Автор пользуется им, когда начинает делать новый сайт. По мере работы, оттуда удаляются куски кода или снимаются комментарии.

        # Базовые установки
        ##############################################
        Options +ExecCGI -Indexes
        DirectoryIndex index.php index.html index.htm

        ### Умолчания ###
        ServerSignature Off
        AddType video/x-flv .flv
        AddType application/x-shockwave-flash .swf
        AddType image/x-icon .ico
        AddDefaultCharset UTF-8
        DefaultLanguage en-US
        SetEnv TZ America/Indianapolis
        SetEnv SERVER_ADMIN webmaster@^^SITE^^.^^TLD^^

        ### FAST-CGI ###
        AddHandler fastcgi-script fcgi
        AddHandler php-cgi .php
        Action php-cgi /cgi-bin/php5-wrapper.fcgi

        # Заголовки и кэширование
        ##############################################
        #### КЭШИРОВАНИЕ ####
        # НА ГОД

        Header set Cache-Control "max-age=2592000"

        # НА НЕДЕЛЮ

        Header set Cache-Control "max-age=604800"

        # НА 10 МИНУТ

        Header set Cache-Control "max-age=600"

        # НЕ КЭШИРОВАТЬ

        Header unset Cache-Control


        # ПЕРЕОПРЕДЕЛЕНИЯ И ПЕРЕНАПРАВЛЕНИЯ
        ##############################################
        ### SEO редирект ###
        Redirect 301 /2006/uncategorized/htaccesselitecom-aboutus.html http://www.^^SITE^^.^^TLD^^

        ### ПЕРЕОПРЕДЕЛЕНИЯ ###
        RewriteEngine On
        RewriteBase /

        # АВТОРИЗАЦИЯ
        ##############################################
        AuthName "^^SITE^^.^^TLD^^"
        Require valid-user
        AuthUserFile /^^SITE^^.^^TLD^^/.htpasswd
        AuthType basic
          +1
          Хорошо, но лучше отредактировать топик :-|
            0
            кеширование на сутки это 86400 секунд ;)
            а строчка "# НА ГОД" на самом деле про месяц
            0
            Ух, спасибо за статью!
              +2
              Есть на эту тему довольно хороший мануальчик. Пользуйтесь.
                0
                огромное спасибо за ссылку.
                0
                AuthName "Prompt"
                AuthType Basic
                AuthUserFile /home/askapache.com/.htpasswd
                Require valid-user

                Может кто подскажет как в таком случае реализовать log out? чтобы зайти под другим пользователем например. А то мы с коллегами собак ели-ели, душили-душили, но до сих пор не было найдено никакого workaround :)
                0
                Извините, конечно, но по-моему это просто ужасно.
                Это не статья, а набор выжимок из разных источников, написанных в совершенно разном стиле, повторяющихся, не откомментированных, неверных в конце-концов.
                Зачем это было написано здесь?
                На любой вопрос по .htaccess давно и понятно отвечает гугл, нужно только правильно спросить.
                  0
                  Моего опыта пока не хватает, чтобы так это оценить. Для меня эта статья была отправной точкой практического применения .htaccess. Я писала в посте, что уровень здесь для начинающих, чтобы люди опытные могли этот пост просто пропустить. В статье есть ссылки для более углубленного изучения тех или иных вопросов (в оригинале их больше), но цель ее - не составление подробного мануала, а создание и минимальное объяснение "затравочного" файла .htaccess для создания сайтов.
                    0
                    Я и говорю, что не очень хорошую отправную точку вы себе выбрали.
                    С опытом придет, что гораздо плодотворнее зайти на официальный ресурс, зайти туда, где написано теми людьми, которые это создали, а не теми, у кого получилось это использовать. Именно получилось.
                    Например, сюда: http://httpd.apache.org/docs/2.0/howto/h…
                    А потом подняться на уровень выше, сюда: http://httpd.apache.org/docs/2.0/
                    И узнать, что оказывается разработчики заботятся о людях, использующих их продукт, и даже часть документации переведена на русский.
                    От себя лично, основываясь на богатом опыте, могу сказать, что умение читать и понимать документацию прежде всего на английском (а в последствии и на любом другом языке) — это основополагающий фактор в разработке программного обеспечения.
                    Надо только знать, где и как искать.
                    Посмотрите, в вашей «статье» даже примеры слизаны с оригинального мануала. Но это примеры (хорошие примеры) сверху приправлены толстым слоем индивидуального восприятия того человека, кто пытался писать документацию. Это восприятие зачастую изменяет, а порой и вообще перевирает факты.
                    Надеюсь, суть моего комментария понятна.
                  0
                  Знающие люди, подскажите плиз, как же все-таки сделать множественные виртуальные субдомены с помощью mod_rewrite?

                  То есть чтобы запросы типа bazooka.example.com переписывались на http://www.example.com/?page=bazooka

                  Надо вроде как добавить server alias *.example.com, но почему-то это никак не хочет работать. Видимо, делаю что-то не так.
                  0
                  Спасибо.
                  У меня вопрос, я все ни как не могу понять как сделать: задача - преобразовать ссылки типа

                  http://domain.ru/STRUCTURE/4523

                  к типу

                  http://domain.ru/index.php?action=structure&id=4523

                  Не подскажете как сделать???
                    0
                    Google, mod_rewrite
                      0
                      Смотря чего Вы этим хотите добиться. Я никогда не встречала необходимости в таком преобразованиие, но всегда приходится делать наоборот. Чтобы сделать наоборот, используются директивы mod_rewrite, ну а чтобы сделать то, что Вам надо, достаточно в файле htaccess установить RewriteEngine Off. Только боюсь, что Вы не совсем правильно формулируете задачу.
                        0
                        Сейчас постараюсь описать.

                        Набирает кто-то в браузере: http://domain.ru - попадает на http://domain.ru/index.php
                        Набирает http://domain.ru/PARTITIONS/7654/USERLOG - попадает на http://domain.ru/index.php и + формируются 3 (до 4) переменные, например $_REQUEST['var1'] = 'PARTITIONS', $_REQUEST['var2'] = '7654', $_REQUEST['var3'] = 'USERLOG' - которые я обрабатываю в файле index.php корневого каталога.

                        То что надо смотреть дерективы mod_rewrite я понял. Весь день смотрю, но так ничего и не добился...

                        Как это будет выглядеть в .htaccess???
                          0
                          Ну, к примеру, так (только регэксп перепишите нормальный вместо (.*)):

                          RewriteEngine On
                          RewriteRule ^(.*)/(.*)/(.*)$ index.php?var1=$1&var2=$2&var3=$3
                            0
                            cпс. Тогда вопрос:

                            RewriteEngine On

                            RewriteRule ^(.*)/(.*)/(.*)/(.*)$ index.php?var1=$1&var2=$2&var3=$3&var4=$4
                            RewriteRule ^(.*)/(.*)/(.*)$ index.php?var1=$1&var2=$2&var3=$3
                            RewriteRule ^(.*)/(.*)$ index.php?var1=$1&var2=$2
                            RewriteRule ^(.*)$ index.php?var1=$1
                            RewriteRule ^$ index.php

                            будет работать? Или следует в обратном порядке написать?
                              0
                              а что мешает сделать ^(.*)$ index.php?input=$1 и разбор делать уже внутри скрипта?
                                0
                                Не работает ни так ни так... Пробовал...
                                Если что, я тестирую на http://vagrancy.ru
                                Там и текущий вид хтаксеса и переменные которые пытаюсь получить...
                      0
                      УРА!!!
                      Методом подтыка подобрал рабочий вариант:

                      RewriteEngine On

                      RewriteCond %{REQUEST_URI} ^(.+)/(.+)$
                      RewriteRule ^(.+)/(.+)$ index.php?var1=$1&var2=$2

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое