Что такое .htaccess и для чего он нужен? - Форум Cheat-Master.ru
  • Страница 1 из 1
  • 1
Модератор форума: Sanoxxx, Alowir  
Что такое .htaccess и для чего он нужен?
DoES Дата: Среда, 26.11.2014, 23:54 | Сообщение # 1
Black Mafia
Сообщений: 1358
Статус: Offline
Цитата
.htaccess (с точкой в начале имени) - это файл-конфигуратор Apache-серверов, который дает возможность конфигурировать работу сервера в отдельных директориях (папках), не предоставляя доступа к главному конфигурационному файлу. Например, устанавливать права доступа к файлам в директории, менять названия индексных файлов, самостоятельно обрабатывать ошибки Apache, перенаправляя посетителей на специальные страницы ошибок. .htaccess представляет собой обычный текстовый документ, расширение которого htaccess. Данный файл обычно находится в корне сайта, однако Вы можете создавать и дополнительные .htaccess-файлы для различных директорий Вашего сайта.


1. Варианты реализации Редиректа с помощью файла .htaccess
Простой редирект:

Код
Redirect 301 / ссылка на сайт

или

Код
redirect /secret домен сайта/nosecret


Ставится в файле .htaccess для Apache. Первый "/" означает, что всё с верхнего уровня сайта, включая все подкаталоги, будет переадресовано (не забывайте поставить последний "/"). Если Вы хотите переадресовать только страницу, сохранив PR старой страницы, можно сделать так:
Redirect 301 /old/old.htm домен сайта/new.htm где:
/old/old.htm - путь и имя старой страницы
http://www.домен/new.htm - новый путь и новое имя перемещенной страницы

3. Редирект на любую страницу по ip пользователя или при запросе конкретной страницы (а также по маске имени).
Если у пользователя ip 192.152.37.126, то он будет перенаправлен на страницу user.php:

Код
SetEnvIf REMOTE_ADDR 192.152.37.125 REDIR="redir"
RewriteCond %{REDIR} redir
RewriteRule ^/$ /user.php


3. Редирект при запросе определённых файлов. Если запрашиваются файлы, расширение которых не указано в файле .htaccess (gif и jpg), то следует перенаправление:

Код
RewriteEngine On
RewriteRule !.(gif|jpg)$ index.php

4. Использование mod_rewrite:
   
Options +FollowSymLinks  
RewriteEngine on  
RewriteCond %{HTTP_HOST} ^домен  
RewriteRule ^(.*)$ домен сайта/$1 [R=permanent,L]


5. Редирект с регулярным выражением:

Код
RedirectMatch 301 (.*) домен сайта$1 Прописывается в файле .htaccess.

(.*) RedirectMatch фактически соответствует регулярным образцам выражения после доменного имени. Таким образом, нельзя выполнить соответствие образца на ^/домен. Однако, можно преобразовать страницы с использованием .html расширения к файлам того же самого названия, но с .php расширением:

RedirectMatch 301 (.*).html$ домен сайта$1.php
Если необходимо сделать различное перенаправление для отдельных страниц, можно использовать следующее:

Код
RedirectMatch Permanent ^/html/resources.html$ http://www.домен/resources.php  
RedirectMatch Permanent ^/html/other_page.html$ http://www.домен/other_page.php  
RedirectMatch Permanent ^/(.*)$ http://www.домен/

"RedirectMatch Permanent" - это эквивалент "RedirectMatch 301", строка с "*(Wildcard)" должна быть последней в этом списке.

6. Создание удобо читаемых URL
Чтобы преобразовать, например, www.домен/product.php?id=123 в www.домен/product/123 следующим образом:

Код
RewriteEngine on
RewriteRule ^product/([^/.]+)/?$ product.php?id=$1 [L]

В следующем примере преобразуем www.домен/script.php?product=123 в www.домен/cat/product/123/:

Код
RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2

7. Редирект на PHP:

Код
header("HTTP/1.1 301 Moved Permanently");  
header("Location: домен сайта/newdir/newpage.htm");  
exit();

Естественно, надо создать страницу, при обращении к которой и будет происходить Редирект, и разместить её на сервере. И лучше укажите HTTP/1.1 (а не HTTP/1.0 или HTTP/0.9, которые не поддерживают виртуальный хостинг)

8. Редирект всех файлов в папке на один файл.
Например вы больше не нуждаетесь в разделе сайта Files и хотите перенаправить все запросы к папке /files на один файл /page.php. Для этого добавляем в .htaccess следующий код.

Код
RewriteRule ^files(.*)$ /page.php [L,R=301]


9. Редирект всей папки кроме одного файла
В следующем примере все файлы из папки /files будут редиректится на на файл /page.php, кроме файла /files/test.html котоый должен редиректится на /test-1.html

Код
RewriteRule ^files/test.html /test-1.html [L,R=301]
RewriteRule ^files(.*)$ /page.php [L,R=301]


10. Редирект динамического URL на новый файл.
Данный вариант пригодится если вы хотите редиректить динамический URL с параметрами на новый статический файл.

Код
RewriteRule ^article.jsp?id=(.*)$ /test.htm [L,R=301]

То есть теперь, запрос к файлу вида домен сайта/article.jsp?id=8547 и/или домен сайта/article.jsp?id=1234 будет отправлен на файл домен сайта/test.htm.

11. Редиректы в зависимости от времени
Когда нужно применять уловки типа содержания зависящего от времени масса вебмастеров все ещё используют CGI скрипты которые производят редиректы на специальные страницы. Как это может быть сделано через mod_rewrite?
Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения <STRING, >STRING и =STRING мы можем производить редиректы зависящие от времени:

Код
RewriteEngine on
     RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
     RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
     RewriteRule   ^foo.html$             foo.day.html
     RewriteRule   ^foo.html$             foo.night.html

Это выдает содержимое foo.day.html при запросе URL foo.html с 07:00 до 19:00 а в оставшееся время содержимое foo.night.html.

12. Убираем у всех запросов вначале "WWW."

Код
RewriteEngine on    # оглашаем, что хотим использовать mod_rewrite
RewriteCond %{HTTP_HOST} ^www.(.*) [NC]
RewriteRule ^/?(.*) http://%1/$1 [L,R=permanent]

Меняем расширение .html на .php
Иногда бывает так, что у Вас статичный веб-сайт, а Вам необходимо, чтобы на нем срабатывал какой-нибудь php-скрипт. Для этого Вам необходимо сказать серверу, чтобы он обрабатывал эту страницу как php-файл.

Код
AddHandler application/x-httpd-php .html

Этот прием можно использовать и для других расширений файлов:

Код
AddHandler application/x-httpd-php .xml
AddHandler application/x-httpd-php .asp


Запрещение доступа в конкретную директорию
1. для всех ко всем файлам в директории:

Код
deny from all


2. к конкретному файлу:

Код
<Files secret.php>
deny from all
</Files>


3 по ip пользователя:

Код
order deny,allow
deny from all
allow from 192.152.37.125

Доступ в данную директорию будет разрешён только пользователю с ip 192.152.37.125.

4. Директива Options -Indexes - запрет на отображение содержимого каталога при отсутствии индексного файла Иногда нужно сделать так, чтобы в случае отсутствия в каталоге файла, который показывается по умолчанию, не выдавался список файлов в каталоге. Тогда можно добавить в .htaccess такую строчку :

Код
Options -Indexes

В этом случае вместо списка файлов в каталоге посетитель получит HTTP ошибку 403 - access forbidden.

5 Запретить доступа к файлам с несколькими типа расширений <Files ~ ".(inc|conf|cfg)$"> deny from all </Files> Запрещен доступ к файлам с расширением *.inc, *.conf и *.cfg. Хотя директива, по умолчанию, не работает с регулярными выражениями, но их можно включить поставив символ тильды(~) в опциях директивы. Синтаксис следующий: [тильда] [пробел] [далее_все_без_пробелов] Чтобы блокировать этот доступ, запишем следующее:

Код
RewriteRule ^.htaccess$ - [F]

Это правило переводится так:
Если кто-то пробует обращаться к файлу .htaccess, система должна произвести код ошибки 'HTTP response of 403' или '403 Forbidden - You don't have permission to access /.htaccess on this server'.
Код
Конструкция ^.htaccess$ в этом регулярном выражении означает:
^ - якорь начала строки
$ - якорь конца строки
. - в регулярных выражениях точка '.' обозначает мета-символ и должна быть защищена обратным слэшем (backslash), если Вы все-таки хотите использовать именно фактическую точку.
Имя файла должно быть расположено точно между начальным и конечным якорем. Это будет гарантировать то, что только это определенное имя файла и никакое другое, сгенерирует код ошибки.
[F] - специальный 'запрещающий' флажок (forbidden).
[NC] - не учитывать регистр букв.
[OR] - означает 'или следующее условие'.


Определение кодировки

Определение кодировки, в которой сервер "отдает" файлы

Код
AddDefaultCharset windows-1251

варианты: KOI8-R, UTF-8, Windows-1251

Определение кодировки на загружаемые файлы

Код
CharsetSourceEnc windows-1251



Задаем собственные страницы ошибок
Задать собственную страницу ошибок можно следующим образом:

Код
ErrorDocument 404 домен сайта/404.php


Индексация директорий и поддиректорий
Чтобы избежать индексации поисковыми системами директорий и поддиректорий, необходимо прописать такую строку, к примеру:


Код
DirectoryIndex index.php

Эта директива задает файл, который будет вызван при обращении к директории без указания имени файла.
Можно указать несколько индексных страниц. При запросе каталога они будут искаться в том порядке, в котором перечислены в директиве DirectoryIndex. Если не будет найден файл index.html, то будет произведен поиск файла index.php и т.д.

Код
DirectoryIndex index.html index.php index.shtml

Лично я предпочитаю переадресовывать с пустых директорий либо на главную страницу сайта, либо на какую-либо другую подходящую страницу. Например, директорию www.домен/pic/ можно переадресовать на www.домен.

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

Код
RewriteEngine on
RewriteCond %{HTTP_REFERER} .
RewriteCond %{HTTP_REFERER} !^http://([^.]+.)?site. [NC]
RewriteCond %{HTTP_REFERER} !google. [NC]
RewriteCond %{HTTP_REFERER} !search?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn. [NC]
RewriteCond %{HTTP_REFERER} !yahoo. [NC]
RewriteCond %{REQUEST_URI} !^/image.gif$
RewriteRule .(gif|jpg|png)$ /image.gif [NC,L]

image.gif - изображение, которое будет отображаться, вместо истинных изображений. Рекомендую в этом изображении отобразить Ваш логотип и ссылку на Ваш сайт.
Еще один варинат запрета доступа к картинкам с неразрешенных сайтов:

Код
SetEnvIfNoCase Referer "^$" local_ref=1
SetEnvIfNoCase Referer "^http://(www.)?htmlweb" local_ref=1
SetEnvIfNoCase Referer "^http://(www.)?images.yandex" local_ref=1
SetEnvIfNoCase Referer "^http://(www.)?hghltd.yandex" local_ref=1
<FilesMatch ".(jpg|gif|png)">
  Order Allow,Deny
  Allow from env=local_ref
</FilesMatch>


Поисковые машини и разного рода сканеры создают коллосальный трафик на вашем сайте. Нижеприведенный блок кода позволит запретить доступ ботам на сайт.

Код
RewriteCond %{HTTP_USER_AGENT} (Googlebot|Slurp|spider|Twiceler|heritrix|
  Combine|appie|boitho|e-SocietyRobot|Exabot|Nutch|OmniExplorer|
  MJ12bot|ZyBorg/1|Ask Jeeves|AskJeeves|ActiveTouristBot|
  JemmaTheTourist| agadine3|BecomeBot|Clustered-Search-Bot|
  MSIECrawler|freefind|galaxy|genieknows|INGRID|grub-client|
  MojeekBot|NaverBot|NetNose-Crawler|OnetSzukaj|PrassoSunner|
  Asterias Crawler|T-H-U-N-D-E-R-S-T-O-N-E|GeorgeTheTouristBot|
  VoilaBot|Vagabondo|fantomBro wser|stealthBrowser|cloakBrowser|
  fantomCrew Browser|Girafabot|Indy Library|Intelliseek|Zealbot|
  Windows 95|^Mozilla/4.05 [en]$|^Mozilla/4.0$) [NC]
RewriteRule ^(.*)$ - [F]
#
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Firefox.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Netscape.* [NC]
RewriteRule ^(.*)$ - [L]
RewriteRule ^(.*)$ - [F]

Отслеживание обращений к файлу robots.txt
Чтобы иметь больше информации о посещении поисковиков, полезно иметь подробную информацио об обращении к файлу robots.txt Для того, чтобы оганизовать это, в '.htaccess' должны быть следующие записи:

Код
RewriteEngine on
   Options +FollowSymlinks
   RewriteBase /
   RewriteRule ^robots.txt$ /robot.php?%{REQUEST_URI}

Теперь при запросе файла 'robots.txt' наш RewriteRule переадресует посетителя (робота) к обрабатывающему запросы скрипту robot.php. Кроме того, переменная передается скрипту, которая будет обработана в соответствии с вашими нуждами. 'REQUEST_URI' определяет имя запрашиваемого файла. В данном примере это - 'robots.txt'. Скрипт прочтет содержание 'robots.txt' и отправит его web-браузеру или роботу поискового сервера. Таким образом, мы можем считать хиты посетителей и вести лог-файлы.


Как заставить html-страницы обрабатывать php-код?
Пропишите в своем файле .htaccess следующие строки:

Код
RemoveHandler .php .htm .html
AddHandler application/x-httpd-php .php .htm .html
Radiance Дата: Четверг, 27.11.2014, 14:34 | Сообщение # 2
Боец
Сообщений: 209
Статус: Offline
Де-факто, если хорошо понимаешь регулярки, то htaccess вполне прост для понимания.

А так, молодец, пост вполне подробный, всё что нужно - всё есть.



Радик камбек :D

DoES Дата: Четверг, 15.01.2015, 08:48 | Сообщение # 3
Black Mafia
Сообщений: 1358
Статус: Offline
Radiance, вообще я бы кратко сказал. Что это файл в котором страницы создавать да и все. Ну правда много функций можно с ним придумать

Добавлено (15.01.2015, 08:48)
---------------------------------------------
upd

Radiance Дата: Четверг, 21.05.2015, 13:54 | Сообщение # 4
Боец
Сообщений: 209
Статус: Offline
UPD:

Столкнулся с такой проблемой.
Имея перенаправление вида:

Код

RewriteRule ^topic/([0-9]+)-([0-9]+)? index.php?t=topic&id=$1&page=$2 [L]  


Cъедался конец урла, а именно &page=[0-9]

Честно, почему так и не понял, но следующий вариант, подсказанный на stackoverflow, помог:

Код

RewriteRule ^topic/([0-9]+)-([0-9]+)? /index.php?t=topic&id=$1&page=$2%{QUERY_STRING} [L]


Cейчас вот перерываю документацию, пытаясь понять, где я упустил такой поворот событий biggrin



Радик камбек :D

  • Страница 1 из 1
  • 1
Поиск: