Jump to content
  • 0

Конфигурирование сайта с помощью htaccess


rus
 Share

Question

Довольно часто встречаются топики где нужно настроить сайт с помощью файла конфигурации htaccess, но описания как именно это сделать на этом форуме по-моему нет..., поправьте если я ошибаюсь.

Предлагаю выделить этот топик и вынести его поверх остальных к уже выделенным.

Вот небольшая статейка из интернета, сразу говорю автор не я, но сво? описание я добавлю чуть ниже так как столкнулся с данной задачей.

————————————————————————————————————————————————————————-

Вступление:

Как известно, все настройки сервера Apache находятся в файлe httpd.conf, доступ к которому имеется не всегда. Например, если используется виртуальный сервер на хостинге, когда один сервер Apache обслуживает сотни сайтов, то, естественно, нельзя позволить владельцу одного сайта менять конфигурацию сервера, которая отразится на всех остальных сайтах. Тем не менее Web - сервер Apache допускает конфигурирование на уровне отдельных каталогов при помощи файлов .htaccess. Именно на работу с этими файлами, как единственными конфигурационными файлами, которые доступны большинству Web - разработчиков, и будет сделан основной упор в этой статье.

Для чего нужен файл .htaccess?

Файл .htaccess (с точкой в начале имени) ? это конфигурационный файл, который да?т возможность настраивать работу сервера на уровне отдельных

каталогов: устанавливать права доступа к файлам в каталогах, менять названия индексных файлов, самостоятельно обрабатывать коды ответов протокола HTTP, модифицировать адреса запрошенных страниц.

Примечание:

Файл .htaccess может быть размещен в любом каталоге. Директивы этого файла действуют на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами файлов .htaccess во вложенных каталогах).

Изменения, вносимые в файлы .htaccess, вступают в силу немедленно и не требуют перезагрузки сервера в отличие от изменений, вносимых в главный конфигурационный файл httpd.conf.

Для того, чтобы файлы .htaccess можно было использовать, необходимы соответствующие настройки главного конфигурационного файла httpd.conf, где должны быть прописаны директивы, которые разрешат файлу .htaccess переопределять конфигурацию Web-сервера в каталоге. Список этих директив зада?тся

директивой AllowOverride.

Директива AllowOverride:

Директива AllowOverride может включать в себя одну из следующих директив или их комбинацию: AuthConfig, FileInfo, Indexes, Limit, Options, All, None

Для того чтобы дать директивам файлов .htaccess максимальные права на изменения директив, значение директивы AllowOverride в файле httpd.conf должно быть равно All. Оно является значением по умолчанию.

Запретить переопределение любых директив в конфигурационных файлах .htaccess можно при помощи значения None: AllowOverride None

Замечание:

Название конфигурационного файла можно изменить, и например, назвать его не .htaccess, a access.conf. За название этого файла отвечает директива AccessFileName в файле httpd.conf. Изменение названия конфигурационного файла .htaccess не рекомендуется, т.к. это может усложнить дальнейшую поддержку сервера.

Синтаксис .htaccess:

Перед тем, как будут рассмотрены примеры, остановимся на синтаксисе директив в файлах .htaccess.

* Пути к файлам и каталогам должны указываться от корня сервера, например, /pub/articles/masters/php/

* При указании абсолютных url обязательно должны быть зааданы протоколы, например:

Redirect / http://www.site.ru

* В файлах .htaccess недопустимы пробелы в указаниях путей к файлам и в названиях самих файлов, т.к. это приводит к генерации кода ответа 500 - ошибка конфигурации сервера: "Internal Server Error".

Примеры использования .htaccess

Индексные страницы:

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

При запросе каталога без указания имени файла сначала будет осуществл?н поиск страницы с именем index.php. Если страницы с таким именем нет в каталоге, то аналогичные операции будут произведены с файлом index.shtml и т.д. до конца списка, пока не будет найдена и открыта соответствующая страница.

Запрет на отображение содержимого каталога при отсутствии индексного файла:

Часто требуется запретить отображение списка файлов в каталоге, если не указан или отсутствует индексный файл. Например, запретить отображение содержимого каталога с изображениями. Если такой запрет не поставить, то пользователь, обратившийся напрямую к такому каталогу, получит список всех изображений.

Ни один сайт не затрахован от возникновения ошибок. Самой частой ошибкой является переход по ссылке на несуществующую страницу. В этом случае Apache генерирует код ответа 404 и отображает автоматически сгенерированную страницу с сообщением об ошибке. Наличие несуществующих страниц производит плохое впечатление на посетителей сайта. Это впечатление можно сгладить, если вместо стандартных страниц, подставлять собственные страницы с сообщением об ошибке. За назначение страниц - обработчиков кодов ответа протокола HTTP нес?т ответственность директива ErrorDocument

ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html

После директивы ErrorDocument следует указать код ответа и страницу, на которую необходимо перенаправить посетителя при возникновении данного кода ответа.

[color=#FF0000]*[/color] 401 ошибка ? Запрос требует аутентификации пользователя (Unautorized).
[color=#FF0000]*[/color] 403 ошибка ? Доступ к запрашиваемому ресурсу запрещ?н (Forbidden).
[color=#FF0000]*[/color] 404 ошибка ? Запрашиваемый документ на сервере отсутствует (Not Found).
[color=#FF0000]*[/color] 500 ошибка ? Ошибка конфигурации сервера или внешней программы (Internal Server Error).

Выполнять код PHP в файлах HTML:

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

RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml

Первая строка удаляет обработчик файлов с расширениями html и htm, а вторая строка сообщает серверу о необходимости использовать для файлов с расширениями htm и html обработчик PHP

Задание кодировки файлов на сервере:

Указанная кодировка отправляется браузеру в заголовке Content-Type и позволит браузеру клиента автоматически переключиться на требуемую кодировку: AddDefaultCharset Windows-1251.

Задание кодировки загружаемых файлов:

При загрузке файлов на сервер можно указать, в какой кодировке сервер должен ожидать файл: CharsetSourceEnc windows-1251.

Отключение директивы MultiViews:

Включ?нная на хостинге опция MultiViews может вызвать неожиданные проблемы, например, отображение несуществующих страниц сайта. Допустим, на сайте существует страница с адресом http://www.sait.ru/down.php, и если посетители обратятся к несуществующему каталогу

http://www.sait.ru/down/, то включ?нная опция MultiViews вместо этого каталога подставит файл down.php. Однако подстановка будет выполнена не полностью - пути к изображениям, таблицам стилей и т.п. будут подставлены неверно. То есть страница будет отображена с искажениями. Для подавления такого поведения Apache опцию MultiViews следует отключить.

Options -MultiViews:

Запрет доступа к файлам.

Для того чтобы посетители не могли получить доступ к служебным файлам из окна браузера, можно запретить доступ к таким файлам. Для этого используется директива запрета Deny и разрешения доступа Allow.

Примечание:

Использование директив Deny и Allow управляет только доступом к файлам из браузера, либо из другой программы-клиента. Подобные запреты не распространяются на скрипты сервера.

Запрет доступа к файлам из браузера:

Deny from all при использовании такой директивы будет запрещ?н доступ из браузера ко всем файлам и каталогам текущего каталога.

Запрет доступа к определенному файлу:

<Files config.php>
Deny from all
</Files>

Здесь запрещен доступ только к файлам с именем config.php.

Запрет доступа к файлам расширения inc:

<Files "*.inc">
Deny from all
</Files>

* - любая последовательность символов, исключая символ слеша (/).

Запретить доступа к файлам с несколькими типами расширений:

<Files ~ ".(inc|conf|cfg)$">
Deny from all
</Files>

Запрещен доступ к файлам с расширением inc, conf и cfg

Запретить доступ с определенного IP-адреса:

Deny from 195.135.232.70

Разрешить доступ только с определенного IP-адреса:

Order deny,allow
Deny from all
Allow from 195.135.232.70

Директива Order позволяет задать порядок, в котором будут выполняться директивы. Сначала выполняется директива запрета доступа(директива Deny), а затем разрешается доступ то для IP-адреса 195.135.232.70 (директива Allow). Если в первой строке поменять порядок следования директив на Order allow,deny, то доступ для IP-адреса 195.135.232.70 не будет открыть, т.к. директива Deny, выполняемая последней, перекроет действие директивы Allow.

Примечание:

Следует отметить, что разрешение доступа с определ?нного IP-адреса иногда может не сработать. Например, в том случае, если на хостинге установлен обратный кэширующий proxy-сервер. Если директивы разрешения доступа не работают, то вам нужно обратиться по этому вопросу в службу технической поддержки хостинга.

Перенаправление на другой адрес:

Часто встречаются задачи, когда все запросы к определ?нному каталогу или странице нужно перенаправить (redirect) на другой адрес. Это можно сделать с помощью директив Redirect и RedirectMatch. Они сообщают, что ресурс по запрошенному url отсутствует, и указывают адрес, по которому следует перейти. Директивы Redirect посылают браузеру соответствующий заголовок, и уже браузер осуществляет перенаправление.

1) Глобальное перенаправление на новый адрес:

Redirect / http://www.site.ru/

2) Перенаправление при обращении к определ?нному файлу:

Redirect /books/index.php http://www.site.ru/newbooks/

3) Перенаправление при обращении к любым страницам каталога:

RedirectMatch /books/.* http://www.site.ru/newbooks/

4) Перенаправление при обращении к любым страницам сайта:

RedirectMatch /.* http://www.site.ru/

Автор: Дмитрий Кравченко

Источник: http://www.articlesworld.ru/

——————————————————————————————————————————————————————————-

Итак, если вы используете SSI тоесть, страницы у вас инклюдятся в шаблон, то для поисковиков необходимо переделать расширение страниц с php в html (ЧПУ-человеко-понятный-урл). У меня все предельно просто, все страницы лежат в корневой дирректории.

Итак, создаем в корне файл .htaccess и вносим в него следующие записи:

RewriteEngine on
RewriteBase /

RewriteRule ^index.html$ index.php
RewriteRule ^specials.html$ specials.php
RewriteRule ^guest.html$ guest.php
RewriteRule ^contakts.html$ contakts.php
RewriteRule ^programms.html$ programms.php
RewriteRule ^spravka.html$ spravka.php

Для директорий нужно как-то по другому..., вобщем чуть позже впишу как.

Итак... решил пополнить инфу о модреврайте.

Задача: сделать ЧПУ из ссылок вида:

http://site.ru/index.php?page=id&categories=name

Это примерный набросок того, как могла бы выглядеть страница не ЧПУ (у всех по-разному).

Итак, начнем с .htaccess:

RewriteEngine on
RewriteBase /
RewriteRule ^([0-9]+)/([A-Za-z_0-9]+)/?$ index.html?page=$1&categories=$2

При этом сама ссылка должна иметь следующий вид:

<a href="http://mysite.ru/24/kategoriya">категория</a>

$result = mysql_query ("SELECT * FROM `pages` WHERE `parent_id` = '0'");
while ($myrow = mysql_fetch_array($result))
{
echo "<a href=\"http://".$_SERVER['HTTP_HOST']."/".$myrow['id']."/".$myrow['categories'])."\">".$myrow['title']."</a>";
}

Теперь разберем что делает модреврайт с ссылкой.

В ссылке есть такая строчка ".$myrow['id']." которая отвечает за вывод инфы по айдишнику из бд.

В .htaccess эту строчку обрабатывает ([0-9]+) так как айди может иметь только числовое значение, то и соответственно запись от 0 до 9 означает весь числовой спектр.

Вторая строчка в ссылке ".$myrow['categories'])." тут уже может быть не только числовое значение, но и буквенное и символьное (в моем случае это нижнее подчеркивание).

В .htaccess эту строчку обрабатывает запись вида: ([A-Za-z_0-9]+) что означает весь спектр букв латинского алфавита, цифер и нижнее подчеркивание.

Вот собственно и все, если кому-то пригодилась инфа - я только рад. :)

Edited by rus
Link to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 0
2rus, зачем создаете информационное загрязнение? Не проще было просто дать ссылки?.. плюс в документации к apache все есть.)

Может и проще, но во-первых есть такой нюанс, я дам ссылку, а там ресурс будет уже удален.

Во-вторых, не все устанавливают у себя на локале сервер и читают к нему документацию.

В-третьих, не все умеют грамотно поставить запрос гуглу, чтобы он им выдал именно ту инфу, которая им нужна.

P.S. а так, да может ты и прав... :/

Link to comment
Share on other sites

  • 0

Буду говорить за себя, ибо для меня лично данная статья оказалась очень полезной.

Ну а если модераторы сочтут это за лишний мусор, то я не обижусь если мой пост удалят :)

Link to comment
Share on other sites

  • 0
Буду говорить за себя, ибо для меня лично данная статья оказалась очень полезной.

Ну а если модераторы сочтут это за лишний мусор, то я не обижусь если мой пост удалят :)

Да я не к тому совсем говорил, что ты. Молодец, что писал, просто читать замучаешся :)

Link to comment
Share on other sites

  • 0
Буду говорить за себя, ибо для меня лично данная статья оказалась очень полезной.

Ну а если модераторы сочтут это за лишний мусор, то я не обижусь если мой пост удалят :)

Да я не к тому совсем говорил, что ты. Молодец, что писал, просто читать замучаешся :)

Да, конечно, не вопрос.

Писанины много - читать долго и трудно - согласен.

Вобщем кому надо - вот!

Link to comment
Share on other sites

  • 0
rusОформить бы... где код - там код, где заголовок - там болд и т.д. статья вообще тру, но линк на автора поставить надо. Исправишь?

Да, все так, мне нужно было удостовериться что статья нужная. Но если я ее буду корректировать, исправлять и ДОПОЛНЯТЬ, то смысл ставить линк на автора? Ведь в эту статью по большому счету можно еще внести дополнения. Исправлю денька через 2-3.

Link to comment
Share on other sites

  • 0

Есть 2 домена d1.ru и d2.ru оба домена используют одну корневую папку, как сделать корректный редирект только для домена d1.ru

например на ссылку такого вида /shop/group_2/group_244/ сделать 301 редирект сюда /shop/group_5/group_41/

но что бы с ссылки /shop/group_2/group_244/ с домена d2.ru редиректа не было

Edited by Sancho74
Link to comment
Share on other sites

  • 0

Есть 2 домена d1.ru и d2.ru оба домена используют одну корневую папку, как сделать корректный редирект только для домена d1.ru

например на ссылку такого вида /shop/group_2/group_244/ сделать 301 редирект сюда /shop/group_5/group_41/

но что бы с ссылки /shop/group_2/group_244/ с домена d2.ru редиректа не было

ну так вот же:


RedirectMatch /shop/group_2/group_244/.* http://www.d1.ru/shop/group_5/group_41/

если речь о полноценных доменах, то как они могут использовать одну корневую папку?

не, ну может физически так бывает и на уровне сервера виртуально как-то разделяют пространства для разных доменных имен, но в ftp по крайней мере ты заходишь на один домен и для него конкретно есть своя директория, заходишь на другой домен - для него другая...

вы можете просто объяснить каким образом осуществляется переход к этим доменам? какой урл получается в строке? можете ли использовать разные .htaccess для этих доменов? и в чем вообще возникла сложность?

Link to comment
Share on other sites

  • 0

Есть 2 домена d1.ru и d2.ru оба домена используют одну корневую папку, как сделать корректный редирект только для домена d1.ru

например на ссылку такого вида /shop/group_2/group_244/ сделать 301 редирект сюда /shop/group_5/group_41/

но что бы с ссылки /shop/group_2/group_244/ с домена d2.ru редиректа не было

ну так вот же:


RedirectMatch /shop/group_2/group_244/.* http://www.d1.ru/shop/group_5/group_41/

если речь о полноценных доменах, то как они могут использовать одну корневую папку?

не, ну может физически так бывает и на уровне сервера виртуально как-то разделяют пространства для разных доменных имен, но в ftp по крайней мере ты заходишь на один домен и для него конкретно есть своя директория, заходишь на другой домен - для него другая...

вы можете просто объяснить каким образом осуществляется переход к этим доменам? какой урл получается в строке? можете ли использовать разные .htaccess для этих доменов? и в чем вообще возникла сложность?

На сервере установлена система управления hostcms, в системе зарегистрировано несколько доменов. Физически на сервере нет папок вида /shop/group_2/group_244/ система задает эти адреса виртуально. Корневая папка у доменов одна - www, т.е. например d2.ru алиас d1.ru

Edited by Sancho74
Link to comment
Share on other sites

  • 0

На сервере установлена система управления hostcms, в системе зарегистрировано несколько доменов. Физически на сервере нет папок вида /shop/group_2/group_244/ система задает эти адреса виртуально. Корневая папка у доменов одна - www, т.е. например d2.ru алиас d1.ru

хорошо, но когда по фтп заходите что видите?

UPD: понял, то есть система использует плагин типа мультисайтинга?

тогда наверняка у нее должен быть так же плагин обработки адресов, типа как в битриксе...

Link to comment
Share on other sites

  • 0

На сервере установлена система управления hostcms, в системе зарегистрировано несколько доменов. Физически на сервере нет папок вида /shop/group_2/group_244/ система задает эти адреса виртуально. Корневая папка у доменов одна - www, т.е. например d2.ru алиас d1.ru

хорошо, но когда по фтп заходите что видите?

UPD: понял, то есть система использует плагин типа мультисайтинга?

тогда наверняка у нее должен быть так же плагин обработки адресов, типа как в битриксе...

По фтп вижу служебные папки типа admin, image и т.д.

Cms поддерживает мультисайтовость. Похоже что в htaccess для конкретного домена не выйдет задать редиректы.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy