В данной статье Вы узнаете о настройках файла htaccess: о редиректах и перезаписи, а также о конфигурировании веб-сервера и его защите.
Что такое .htaccess? (Hypertext Access)
Это файл-конфигуратор на уровне каталога, который загружается сервером и дает возможность существенно изменить его поведение (перенаправления, включение/отключение определенных функций). Этот файл также позволяет защитить некоторые разделы сайта.
Из-за специфики названий тип файла htaccess не всегда заметен. Чтобы его увидеть, необходимо активировать “ dot files ” или “ .files ” в вашем программном обеспечении FTP/Cpanel. Если возникают сложности, можно создать и редактировать файл как .txt (просто изменить расширение и название во время загрузки).
Всегда делайте бэкап htaccess, когда собираетесь внести какие бы то ни было изменения. Если ошибетесь, сайт высветит ошибку 500 Internal Server Error, и для последнего изменения можно будет просто поместить символ # перед кодом в файле htaccess.
- Вы можете комментировать ссылки в htaccess с помощью # , количество символов не имеет значения; к примеру, ## или ### можно использовать для описательных комментариев, а один # — для активации/деактивации кода.
- Используйте блокнот для редактирования в Windows, это удобно.
- Всегда делайте бэкап.
- Htaccess применяется к каталогу, в котором находится, и, таким образом, ко всем каталогам уровнем ниже; это значит, что при перемещении в корневой каталог, он сможет управлять всем сайтом.
- Ошибки в htaccess провоцируют 500 Internal Server Error ( внутреннюю ошибку сервера), но без паники — восстановите резервную копию или откомментируйте последний код.
Перезапись кода
Просто поместите этот код в файл htaccess в верхней части, чтобы включить перезапись.
## Rewrite Engine Code ##
Options +FollowSymLinks
RewriteEngine on
Управление ошибками
По умолчанию браузер показывает страницу 404, с помощью htaccess страницу можно изменить. Создание интересной страницы 404 — тема для отдельной статьи.
Вы можете создавать собственные страницы в любом формате PHP/HTML.
Они не обязательно должны быть в корневом каталоге, но обязательно на одном сервере.
Если поместите URL целиком, тогда статус 404 не появится, скорее всего будет 301 или 200 Error.
ErrorDocument 404 http://www.example.com/404.html
## Error Handling Codes ##
ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 400 /400.html
Можно использовать больше или меньше кодов. Полный список кодов ошибок по ссылке Wikipedia.
Временная блокировка индексации
К примеру, может понадобиться, чтобы некоторое время люди вначале попадали на промостраницу. (Вы можете использовать index.php и для других целей).
Это больше относится к сфере общей безопасности и юзабилити, чем к SEO .
Этот сниппет кода блокирует доступ пользователей к спискам файлов.
## Block Index Display ##
Options All -Indexes
Set Default Index File
В любом случае, это удобный код. Нужно только изменить файл; тип файла не обязательно должен быть в HTML.
## Set Default Index Files ##
DirectoryIndex newindex.html
Защита Htaccess
Ваш файл htaccess потенциально уязвим, поэтому обезопасьте его.
## Secure htaccess file ##
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>
Если у вас WordPress, такой код защитит файл wp-config.php.
## Secure wp-config.php ###
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>
Защита локации паролем
С помощью htaccess вы можете защитить определенные сегменты сайта. Вот полезный инструмент для создания этих файлов http://www.tools.dynamicdrive.com/password/
Так, с помощью htaccess и похожего файла htpasswd вы можете блокировать общий доступ к любому файлу или папке на сайте.
Используя тот же метод, что и для htaccess, создайте текстовый файл без названия, тип файла htpasswd. Он будет содержать список имен пользователей и паролей для входа в закрытые разделы, формат такой:
MyUsername:MyPassword
Нужно загрузить файл htpasswd в соответствующее место на сервере с помощью любой программы для пересылки файлов, это должен быть каталог не для общего доступа (не помещайте в /www/ или /htdocs/ ). И еще нужно записать путь файла из корневого каталога, это может выглядеть так:
“ /private/script/.htpasswd “.
После загрузки в htaccess добавляется новый раздел.
AuthName “Restricted Area”
AuthType Basic
AuthUserFile /private/script/.htpasswd
<Files /downloads>
require valid-user
</Files>
Блокировка прямых ссылок (хотлинкинг)
htaccess экономит полосу пропускания, таким образом решается проблема известная как хотлинк ( включение в веб-страницу ресурсов чужого сервера) .
Если хотите, чтобы люди не ссылались на ресурсы вашего сайта, используйте следующий код. Свой домен необходимо добавить как исключение, конечно же, поскольку это блокирует все другие сайты.
## Block Hotlinking ##
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ – [F]
Если только 1-2 специфических сайта (обычно социальные) приводят к данной проблеме, используйте код:
## Block Hotlinking ##
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?myspace\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?friendfeed\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?livejournal\.com/ [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ – [F]
Это крайняя мера, которую стоит применять в случаях, когда имеются частые хотлинкеры .
«Сохранить как»
Если у вас блог или другой контентный сайт, определенные файлы будут провоцировать диалог “Save As” (сохранить как), вместо того, чтобы браузер их загружал. Этот код идеален для каталога ресурсов.
Целесообразнее выбрать определенный подкаталог для кода.
## Force a file to download with a “Save As” ##
AddType application/octet-stream .doc .mov .avi .pdf .xls .mp4
Перенаправить всех, c сохранением IP
Этот способ удобен во время внеплановых работ по технической части.
## Redirect Everyone but Selected IP Address ##
ErrorDocument 403 http://www.myoldsite.com
Order deny,allow
Deny from all
Allow from 111.111.111.111
Понадобится изменить ваш собственный IP-адрес (скопировать линию для каждого IP сотрудников), и отключить это, когда все будет готово.
Выборочная блокировка IP
В случае масштабной спам-атаки, можно заблокировать IP-адреса, которые содержатся в логах. Достаточно добавить этот сниппет кода, чтобы закрыть доступ к сайту.
Также вы можете с помощью этого сайта сгенерировать код блокировки любых IP:
http://www.htaccesstools.com/block-ips/
## Block IP Address ##
order allow,deny
deny from 127.0.0.1
deny from 127.0.0.2
deny from 127.0.0.3
allow from all
Раздел 2: перенаправления и перепись
Htaccess позволяет переписать и изменить URL, заменить автоматически созданные ссылки.
Перенаправление с http:// на www
Это старая проблема — добиться, чтобы сайт индексировался и в http://mydomain.com, и в www.mydomain.com.
Иногда бывает так, что сайт индексируется дважды, что не совсем хорошо в плане SEO.
Данная часть кода превратит любой запрос для версии http в www.
## Redirect non-www to the www version ##
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
Измените example.com на своей домен.
Перенаправление файла индекса (Index File) в корневой каталог
Еще одна проблема двойной индексации: поисковики индексируют и
www.example.com/ и www.example.com/index.php.
С помощью этого простого сниппета кода можно добиться, чтобы запросы файла переправлялись в корневой каталог.
## Redirect index to root ##
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*index\.html\ HTTP/
RewriteRule ^(.*)index\.html$ /$1 [R=301,L]
В этом коде нужно изменить и название файла индекса (в 99% случаев это просто индекс), и расширение (обычно html, htm or php).
Перенаправление всех страниц на SSL
Способ обезопасить подразделы сайта. Этот код подходит не для всех случаев. Все, что в папке и ниже, переместится в https, но это не совсем подходящий вариант для корневого каталога htaccess.
Еще понадобится сертификат безопасности и настройки сервера.
RewriteBase /
RewriteCond %{REMOTE_HOST} !^111\.11\.11\.11
RewriteCond %{REQUEST_URI} !^/downtime\.html$
RewriteRule ^(.*)$ /downtime.html [R=302,L]
## Redirect all Pages to Secure ##
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Стандартное перенаправление 301
Перенаправление 301 сообщает Google и браузерам, что запрашиваемая страница перемещена в другое место.
Такой способ подходит, когда вы хотите удалить страницы сайта, или изменить названия ссылок, — так наносится минимальный ущерб продвижению.
Это намного лучше в сравнении со страницей 404, так, по крайней мере, внешние ссылки будут попадать на рабочие страницы.
## Standard 301 Redirect for Permanent Changes ##
redirect 301 /old-page.html http://www.example.com/newpage.html
Нужно изменить только две ссылки: первая — это старая страница, связанная с htaccess (обычно в корне), и вторая — полная ссылка на новую локацию. У вас может быть столько линий, сколько вы хотите перенаправить, но не стоит перенаправлять один и тот же url несколько раз.
Для больших сайтов перенаправления целесообразнее группировать по дате — так проще. Помните, что можно добавить # и превратить линию в комментарий.
Стандартное перенаправление (301) — подкаталог
Может понадобиться перенаправление всех подкаталогов сайта, возможно, вы переместили весь блог в корневой каталог , или убрали старый раздел статей.
Есть два способа сделать это:
## Redirect for a Directory – Preserves Request ##
RedirectMatch 301 ^/old-folder(.*) http://www.example.com/$1
Первый — сохраняет запрашиваемый файл. Если кто-то запрашивает mysite.com/blog/example.html — последует перенаправление на mystie.com/example.html.
Это удобно, когда вы хотите, чтобы определенных файлов больше не было в подкаталоге или когда нужно поместить блог или раздел статей в корневой каталог.
Лучше убедиться, что новые файлы присутствуют, в противном случае появится 404.
Второй способ перенаправления используется, когда вы удалили подкаталог и хотите проверить, что не растеряли всех пользователей или ссылки, которые идут на старый подкаталог, и перенаправить их на обновленную страницу.
## Redirect a Directory – Does not preserve Request ##
RedirectMatch 301 ^/old-folder(.*)$ http://www.example.com/new-page.php
Опять же, кастомизировать эти коды очень просто. Нужно лишь вписать старый каталог и новые локации . Если хотите перенаправить на новый подкаталог, просто измените окончание url, чтобы там был подкаталог, но проверьте, что вы оставили $1 в первом примере.
302
Разница между пренаправлениями 301 и 302 в том, как их фиксируют поисковые роботы. Google вряд ли обновит свой индекс для 302, но для 301 это очень даже вероятно. 302 стоит использовать только тогда, когда изменения временные и вы хотите, чтобы Google их игнорировал. Чтобы превратить перенаправление в 302, просто измените цифру в начале. Это работает применительно ко всем сниппетам кодов перенаправления, где используется 301.
## Standard 302 Redirect for Temporary Changes ##
redirect 302 /old-page.html http://www.example.com/newpage.html
Изменение типа запросов файлов
Иногда нужно изменить типы файлов, для лучшего сжатия изображений, или для специального дополнения с php; htaccess справится со всем этим.
Этот код перенаправит все запросы, поэтому проверьте, загружены ли все новые страницы, нет ли «бродячих» файлов старого типа.
## Code to make all HTML requests become PHP requests ##
RedirectMatch 301 (.*)\.html$ http://www.example.com$1.php
Для кастомизации вы можете заменить типы файлов, в данном случае html — старый тип, а php — новый.
Перенаправьте все подкаталоги, за исключением корневого каталога
В случае, если нужно перенести блог на отдельный домен, понадобится изменить URL нового сайта, удостоверьтесь, что этот код подходит для работы с корневым каталогом и сохраняет запросы.
## Redirect an Entire Domain – Preserve Request ##
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]
## Redirect all Subfolders to New Domain but Keep Root Intact ##
RewriteRule ^([^/]+)\/(.*)$ http://www.example.com/$1/$2/$3 [R=301,L]
Перенаправление всего домена
Иногда возникает ситуация, когда нужен новый домен, но нужно и сохранить все, что было сделано по части SEO для старого домена.
У вас должен быть Google Webmaster Tools, установленный на старом домене, затем вы сможете сообщать Google, что перемещаете домены.
Есть два способа: с сохранением запросов и без. Если у нового домена будет такой же сайт и столько же страниц и ресурсов, тогда лучше сохранить запросы. Другими словами, пользователь, запрашивающий /best-page.html на старом сайте, увидит best-page.html на новом.
Вы можете сделать полное перенаправление домена без сохранения запросов.
По сути, нужно отдельно перенаправить разделы веб-сайта на соответствующие разделы нового сайта, но есть более простой способ.
## Redirect an Entire Domain – No Preservation ##
Redirect 301 / http://www.newdomain.com
Перепись динамического URL
Большинство динамических URL выглядят примерно так:
http://www.mysite.com/posts.php?category=widgets
Они состоят из домена, файла и строки запросов, которая, в свою очередь, состоит из двух частей : поля и значения.
Для оптимизации URL нужно убрать строку запросов и использовать ее для создания структурированного URL.
В первом случае сделаем URL, который заканчивается как статический файл, то есть превратим URL в http://www.mysite.com/posts-about-widgets.php
RewriteRule ^posts-about-([^/]+).php/?$ /posts.php?category=$1&foo=bar [L]
RewriteCond %{QUERY_STRING} category=([^/]+)
RewriteCond %{QUERY_STRING} !foo=bar
Задается маппинг старого URL на новом.
Здесь три линии; первая определяет место старого URL на новом, вторая — место 1-ой строки запросов, третья — точка остановки, чтобы избежать беспрерывного перенаправления.
Первая линия позволяет установить формат новой страницы, в нашем случае это http://www.mysite.com/posts-about-widgets.php.
Вы можете изменить первую часть URL.
В скобках в конце — поле значения строки запросов, которая сюда переносится. Так URL выглядит достаточно динамично, чтобы отображать отношения с базой данных.
В этом примере — посты из категории виджетов, поэтому нужны соответствующие ключевые слова в URL.
PHP — тип файла, который используется в данном случае, но это может быть html или htm.
Третья выделенная часть содержит оригинальный URL и строку запросов. Включено только поле, значение переносится как переменная.
Вторая линия содержит ссылку на переменную, понадобится изменить поле — добавить ваш URL, а все остальное оставить. По сути, этот код сообщает: «любое количество различных символов и цифр».
Теперь у нас новая страница, но, вероятнее всего, система все еще будет генерировать старые ( уродливые) URL, поэтому нужно перенаправить людей на новую страницу. Для этого понадобится правило переписи/замены Rewrite Rule , которое заменяет запросы для строки запросов в новом ярком URL:
RewriteRule ^posts\.php$ /posts-about-%1.php? [L,R=301]
Относительно просто, не так ли? Нужно только поместить ваш старый URL в первую часть, ваш новый URL — во вторую часть. И вуа-ля! Динамическое перенаправление на новую страницу со старой переменной готово!
Совместим части кода. Мы заменили пример с текстом для вставки, чтобы запомнить части, к которым относится каждое утверждение (statement).
Возможно, вы захотите перейти к новому типу URL, возможно, вернуться обратно, к странице http://www.mysite.com/posts/widgets instead of that .php. Это также возможно, нужно лишь немного изменить код.
## Rewrite Dynamic URL to A Static Page ##
RewriteRule ^new-page-([^/]+).php/?$ /old.php?field=$1&foo=bar [L]
RewriteCond %{QUERY_STRING} field=([^/]+)
RewriteCond %{QUERY_STRING} !foo=bar
RewriteRule ^old\.php$ /new-page-%1.php? [L,R=301]
## Rewrite Dynamic URL to A Static SubFodler ##
RewriteRule ^new-folder/([^/]+)/?$ /old.php?field=$1&foo=bar [L]
RewriteCond %{QUERY_STRING} field=([^/]+)
RewriteCond %{QUERY_STRING} !foo=bar
RewriteRule ^old\.php$ /new-folder/%1/? [L,R=301]
Здесь все так, как и прежде, но в данном случае мы назвали первый подкаталог вручную и позволили полю стать вторым подкаталогом.
Раздел 3: скорость и тонкая настройка
Последний раздел этого руководства посвящен тонкой настройке, которая позволяет улучшить скорость и производительность сайта. Многие из этих сниппетов кода зависят от активности отдельных модулей или разрешений, это значит, что разные серверы и хосты могут вести себя по-разному.
GZIP compression
GZIP compression — серверная функция, которая уменьшает вес веб-страниц и скриптов прежде, чем они отправляются в браузер.
Прежде эта технология была довольно несовершенной, в особенности в безопасных разделах и платежных шлюзах. Сейчас все на порядок лучше. Большая часть браузеров (даже старых) принимает GZIP.
Есть несколько вариантов активировать GZIP. Не нужно изменять код — просто скопируйте и вставьте.
На этом сайте можно проверить, активирован ли GZIP на вашем ресурсе, и сколько времени/места сэкономлено.
http://www.gidnetwork.com/tools/gzip-test.php
Вот четыре способа, выберите один из них:
## Enable GZIP Version 1 ##
php_value output_handler ob_gzhandler
css_value output_handler ob_gzhandler
js_value output_handler ob_gzhandler
##ENABLE GZIP Version 2##
<Ifmodule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text\.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image\.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</Ifmodule>
##Enable GZIP Version 3##
<Files *.php>
SetOutputFilter DEFLATE
</Files>
<Files *.js>
SetOutputFilter DEFLATE
</Files>
<Files *.css>
SetOutputFilter DEFLATE
</Files>
<Files *.html>
SetOutputFilter DEFLATE
</Files>
##Enable GZIP Version 4##
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
Активация кэширования
Кэширование позволяет постоянным посетителям не загружать повторно каждый элемент сайта. Если у вас WordPress, тогда можно взять несколько плагинов, например WP Hyper Cache.
Если у вас статический сайт, htaccess дает возможность применить кэширование. Стоит все перепроверить. Если у вас нестандартная CMS, или какой-либо динамический контент, ошибки с кэшированием могут привести к тому, что сайт перестанет обновляться. Поэтому стоит консультироваться с разработчиками.
Если нужна более расширенная команда кэширования или больший уровень контроля, лучше использовать скрипт в этой ветке WMW , читайте внимательно, чтобы точно знать, что делаете.
У кода, размещенного ниже, другие настройки кэширования для разных типов файлов. Вы также всегда можете отключить этот код.
## Enable Caching ##
## Files to Cache for One Month ##
<FilesMatch “\.(flv|gif|jpg|jpeg|png|ico|swf)$”>
Header set Cache-Control “max-age=2592000”
</FilesMatch>
## Files to Cache for One Week ##
<FilesMatch “\.(js|css|pdf|txt)$”>
Header set Cache-Control “max-age=604800”
</FilesMatch>
## Files to Cache for One Day ##
<FilesMatch “\.(html|htm)$”>
Header set Cache-Control “max-age=43200”
</FilesMatch>
## Disable cache for script files ##
<FilesMatch “\.(pl|php|cgi|spl|scgi|fcgi)$”>
Header unset Cache-Control
</FilesMatch>
GZIP и кэширование существенно улучшают производительность сайта.
Минимизация 404 за счет проверки грамматических ошибок
Check Spelling — это модуль сервера Linux Server Module. Check Spelling проверяет сервер на предмет наличия подобных URL.
К примеру, пользователь допускает ошибку, вписывая в браузер такой адрес:
http://www.mysite.com/caje/red.html
Но на самом деле он/она хотел написать:
http://www.mysite.com/cake/red.html
Check Spelling фиксирует такую незначительную ошибку и исправляет ее (если, конечно, не существует caje/red.html). Также учитывается состояние регистра строчных и прописных символов в URL.
##Make Linux correct case sensitive urls/slight typos in urls##
CheckSpelling On