.htaccess
htaccess должен быть записан в формате ОС вашего сервера.
Дело в том, что в Windows и DOS перевод строки обозначается двумя спец-символами - "\r\n" (0x0D 0x0A или 13 10), а в UNIX одним - "\n" (0x0A или 10).
Поэтому если на сервере стоит UNIX, то файл, написанный под Windows, работать не будет.
Поэтому его необходимо одно из следующего:
a) открыть в 16-ричном редакторе и запустить замену 0x0D на 0x20 (пробел в 16-ричном варианте).
b) Обработать файл данной функцией (php5):
<?php file_put_contents($filename, strtr(file_get_contents($filename, array("\r\n" => "\n")))); ?>
c) Создавать файл непосредственно на сервере с помощью php-скрипта.
d) Использовать ASCII-режим передачи данных в вашем ftp-клиенте.
e) Настроить ваш php-редактор так, чтоб он сохранял файлы в UNIX-формате.
Зачем нужен файл ".htaccess".
Cамый популярный веб-сервер -
Apache. Одним из самых весомых преимуществ этого сервера (помимо бесплатности, быстроты и небольшого потребления ресурсов) является гибкость настройки.
В Apache веб-мастер может сделать практически все, что угодно. Создать собственные страницы ошибок, запретить доступ к определенным файлам и папкам, изменить обработку файлов (например, обрабатывать .html файлы как скрипты написанные на Perl) и многое другое.
Все это (и многое другое) можно настроить через специальный конфигурационный файл Apache - "httpd.conf".
Правда, есть одно но: этот файл глобальный для всего сервера. А что делать если хочется установить специальные настройки только для конкретной директории: в файле "httpd.conf" предусмотрено задание директив только для определенной директории, но.
1. Для того, что бы изменения вступили в силу необходимо перезагрузить (рестартовать) Apache сервер.
2. Для любых (даже невинных) изменений, нужно редактировать критичный для всего сервера файл.
Создатели Apache решили данный вопрос: вместо того, что бы каждый раз редактировать файл httpd.conf, в директории, для которой хотите сменить настройки Apache по-умолчанию, создайте файл ".htaccess". Далее в этом файле поместите все настройки, которые необходимо применять для текущей директории.
Директивы из файла ".htaccess" имеют более высокий приоритет, чем определенные в глобальном конфигурационном файле httpd.conf.
Данный подход дает владельцам сайтов возможность управлять параметрами сервера только для их директорий, не беспокоя администраторов сервера.
Для того, что бы файл ".htaccess" заработал, администраторы веб-сервера должны явно разрешить это в файле httpd.conf:
AllowOverride <список параметров, которые разрешено менять>
Таким образом, администратор вполне может запретить вам менять, если не все, то некоторые из параметров через ".htaccess". Разрешить менять любые параметры можно вот так:
AllowOverride All
Запретить изменения параметров через ".htaccess" совсем, можно вот так:
AllowOverride None
Учтите, что приведенные выше директивы должны быть в файле "httpd.conf".
Возможности файла ".htaccess"
1. Разрешить или запретить доступ к файлам с определенного IP адреса.
Предположим, что вы создали прототип веб сайта и решили показать его своему другу/заказчику. Ваше естественное желание, что бы открыть данный сайт мог только этот человек и никто другой. Этого можно добиться, поместив следующие директивы в файл ".htaccess":
order allow,deny
deny from all
allow from <xxx.xxx.xxx.xxx>
allow from googlebot.com
В примере файлы разрешено просматривать роботу Google, который приходит с доменного имени googlebot.com.
Возможно указание нескольких IP адресов через пробел. Также возможно указывать лишь честь IP адреса. Например, для того, что бы разрешить видеть ваш сайт всем из локальной сети, нужно написать что-то подобное: allow from 192.168
То же самое можно проделать, если вы хотите запретить кому-либо просмотр вашего сайта. Результат должен выглядеть вот так:
order deny,allow
allow from all
deny from 192.168.35.111
deny from googlebot.com
2. Запрет или разрешение доступа к определенным файлам.
Запрет и разрешение доступа к файлам в директории - это прекрасно. Однако, что если необходимо закрыть доступ не ко всем, а только в определенным файлам в директории? Для этого существует директива Files, которая позволяет задать файлы к которым будут применяться вложенные директивы. Рассмотрим несколько примеров:
<Files "test.php">
order allow,deny
deny from all
</Files>
Данная конструкция запрещает доступ только к одному файлу: test.php
<Files "*.inc.php">
order allow,deny
deny from all
</Files>
А этот пример запрещает доступ к файлам с окончанием: .inc.php
В выражениях можно использовать символы: * - для любой последовательности любых символов, ? - для одного любого символа.
Так же существует директива (FilesMatch), позволяющая задавать совпадение имен файлов через регулярное выражение. Если вы не знаете, что такое регулярное выражение, то можете посмотреть
При помощи регулярных выражений наш предыдущий пример можно записать вот так:
<FilesMatch "inc.php$">
order allow,deny
deny from all
</FilesMatch>
Как видите, нам уже не нужен знак * в начале (регулярные выражения по-умолчанию ищут подстроку). Но теперь мы должны явно указать на то, что имя файла должно оканчиваться на inc.php. Знак $ и служит для указания на то, что inc.php должно быть в конце строки.
Регулярные выражения - это очень мощный инструмент, позволяющий задать достаточно сложные шаблоны совпадений. Однако не стоит ими увлекаться. Их обработка требует от сервера на порядок больше вычислительных ресурсов. Поэтому, старайтесь избегать их использования.
Хочу обратить ваше внимание на одни факт. Запрещение обращения к файлу/файлам осуществляется
только для протокола http. Из скриптов, которые выполняются на сервере, вы всегда может читать все "закрытые" файлы.
3. Организация перенаправления (редиректа).
При помощи файла ".htaccess" можно организовать перенаправление пользователя, если это необходимо.
Предположим, что необходимо сделать так, чтобы при доступе к файлу www.site.ru/xxx.html пользователь перенаправлялся бы на страницу www.site.ru/yyy.html. Сделать это можно так:
Redirect 301 /xxx.html http://www.site.ru/yyy.html
Цифра 301 указывает серверу, какой редирект использовать. 301 - постоянный редирект. 302 - временный. Постоянный - используется если страница была перемещена навсегда. Временный - если страница только временно недоступна (например, сайт находится в переработке).
Если необходимо перенаправить сразу список файлов, соответствующих некоторой маске, то используется вот такая конструкция:
RedirectMatch 301 /test(.*) http://www.site.ru/$1
Данная конструкция будет перенаправлять запросы к страницам, начинающимся со слова test на страницу без слова test вначале. Например, при доступе к http://www.site.ru/test_1.html пользователь будет перенаправлен на страницу http://www.site.ru/_1.html
$1 обозначает все то, что соответствует выражению в скобке (в нашем случае - это любое количество любых символов).
4. Задание кодировки страницы.
При помощи файла ".htaccess" можно задать кодировку страницы. После этого сервер сам будет сообщать браузеру о кодировке и вам не будет нужно вставлять в код страницы мета тег:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Задать кодировку можно так:
AddDefaultCharset windows-1251
Эту директиву можно применять внутри FilesMatch блока, т.е. задать кодировку только для определенных файлов, что иногда может быть очень полезно.
5. Отображение скриптов в браузере.
Если вы хотите заставить сервер отобразить, например, perl или python скрипт в браузере вместо того, что бы выполнить его, то используйте следующую директиву:
RemoveHandler cgi-script .pl .py .php
Для скриптов на PHP данный метод будет работать, только если PHP установлен как cgi. Если же PHP установлен как модуль Apache (mod_php), то необходимо применить другой метод:
AddType text/html .php
6. Собственные страницы ошибок.
Иногда случаются различные ошибки, и тогда сервер отправляет пользователю некую страницу с ошибкой по-умолчанию. Обычно это простая надпись об ошибке на белом фоне. Для того, что бы ваши пользователи увидели красивую страницу с ошибкой, с вашим собственным дизайном и текстом, следует использовать следующую директиву:
ErrorDocument <код_ошибки> /error.php
Здесь "код_ошибки" - код ошибки, в ответ на которую будет выдана данная страница.
Например, для того что бы при обращении к несуществующей странице вашего сайта (ошибка 404) пользователь был переадресован на страницу 404.php нужно написать следующее:
ErrorDocument <404> /404.php
Возможности файла ".htaccess" очень обширны и даже на простое их перечисление займет объем небольшой книги.
Q.
Не работает страница ошибки, хоть и прописана верно.
A.
Если у Вас прописана в .htaccess директива
ErrorDocument 404 /error.htm
и сам файл нормально просматривается через броузер, но при возникновении 404-й ошибки не выводится. Что делать?
Скорее всего проблема в том, что у Вас броузер IE, а сам файл меньше 512 байтов. Есть у IE такая ошибка. Просто добавьте в файл error.htm пробелов, чтобы его размер был больше 512 байт и проблема исчезнет.
Q.
Как сделать, чтобы php обрабатывался в файлах с расширением .html?
A.
Вам необходимо добавить в файл .htaccess следующие две строчки:
RemoveHandler .html
AddType application/x-httpd-php .html
Q.
Как забанить?
A.
# BEGIN
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule ./error403.html - [L]
</IfModule>
# END
Order Allow,Deny
Allow from all
Deny from xx.xx.xxx.xxx
ErrorDocument 403 /error403.html
Строка RewriteRule ./error403.html - [L]
говорит серверу о том, что путь к файлу error403.html не должен меняться с помощью ЧПУ. И еще: файл error403.html должен лежать в корне и его размер должен быть больше 500 байт
Q.
Как заблокировать доступ к сайту/папке сайта с определенного компьютера?
A.
Для этого необходимо в корне сайта (или в нужной папке) добавить в файл .htaccess строки:
Order Allow,Deny
Allow from all
Deny from xxx.xxx.xxx.xxx
где xxx.xxx.xxx.xxx - это ip-адрес компьютера, которому запрещается доступ. Возможно также указывать доменное имя. В директивах Deny и Allow можно перечислять через пробел ip или доменные имена. Директива Order определяет последовательность применения директив Allow и Deny, т.е. "Order Allow,Deny" сначала разрешит доступ тем, кто упомянут в директиве Allow, затем запретит тем, кто упомянут в Deny. Если стоит задача обеспечить доступ только с определенного компьютера, то следует давать такие директивы в .htaccess:
Order Deny,Allow
Deny from all
Allow from xxx.xxx.xxx.xxx
Q.
Как сделать так, чтобы при обращении по адресу site.ru пользователь перебрасывался бы на www.site.ru?
Необходимо добавить в файл .htaccess следующие строки:
A.
RewriteCond %{HTTP_HOST} !^www\.site\.ru [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule (.*) http://www.site.ru/$1 [L,R]
Примечание: этот способ работает только с одним привязанным к сайту доменом. Если к сайту привязаны еще какие-либо домены, то при обращении к ним пользователь также будет перебрасываться на www.site.ru
Q.
Как запретить посещать мой сайт людям, которые пользуются прокси-сервером?
Не каждый прокси-сервер отмечает свое присутствие в заголовках http-запроса. Поэтому со 100%-й гарантией это сделать невозможно. Однако, большинство прокси-серверов ставят в заголовок http-запроса поле Vi
A.
Рассмотрим пример, который отправляет всех пользователей, которые пришли через прокси-сервер, на главную страницу PeterHost.Ru. Для этого в файл .htaccess надо добавить следующие строчки:
A.
RewriteEngine On
RewriteCond %{HTTP:VIA} .+
RewriteRule (.+) http://site.ru/
Q.
301 redirect
A.Вариант 1.
RewriteCond %{HTTP_HOST} ^(.*\.)?olddomain.com$
RewriteRule ^(.*)$ http://newdomain.com/$1 [R=301,QSA]
Вариант 2.
RewriteCond %{HTTP_HOST} ^(.*\.)?olddomain.com$
RewriteRule ^(.+)$ /? [R=301,L]
Редирект 301 (301 Permanent Redirect) используется в нескольких случаях: при смене домена, при переносе страницы сайта, для склейки имени сайта с www и без него. Это важно для передачи Page Rank (PR) и сохранения поискового трафика.
Сам я столкнулся с его необходимостью, когда после переезда своего портала из зоны com, в ru обнаружил, что Google, Яндекс и другие поисковые системы, естественно не "забывают" старого сайта (отчасти еще и из-за того, что у меня была некорректно установлена своя страница, для обработки 404 ошибки, которая возвращала код ответа 200 OK). Более того, Google за полгода оставил для нового сайта PR=0, хотя для старого он сохранился PR=4.
Тема 301 редиректа постоянно обсуждается в различных SEO-форумах, да и каждая поисковая система в своей системе помощи имеет специальные разделы. Пока разбирался я нашел перечисленные ниже варианты организации редиректа, часть из которых опробовал у себя.
301 редирект это наилучший метод сохранения ваших позиций в поисковых системах, когда вы переносите страницу или сайт. Код "301" интерпретируется как постоянное перемещение ("moved permanently").
Простой редирект (в файле .htaccess или httpd.conf для Apache):
Redirect 301 / http://www.you.com/new.htm
где:
Redirect 301 - это инструкция, говорящая что страница перемещена
/ - означает, что все с верхнего уровня сайта, включая все подкаталоги, будет переадресовано
http://www.you.com/new.htm - новая страница или сайт (не забывайте поставить последний "/", если переадресация идет на сайт).
Чтобы переадресовать только страницу, сохранив PR старой страницы:
Redirect 301 /old/old.htm http://www.you.com/new.htm
где:
/old/old.htm - путь и имя старой страницы
Аналогичный синтаксис для переадресации сайта:
RedirectPermanent / http://www.you.com/
Пример переадресации каталога:
RedirectPermanent /old-directory http://www.domain.com/new-directory/
Например, зашедших в test переадресуем на www.test.com, остальных на enter.test.com (порядок следования записей важен):
Redirect permanent /test http://www.test.com/
Redirect permanent / http://enter.test.com/
Примечание: для моих целей (изменение домена) хватило первого варианта простого 301 редиректа.
Использование mod_rewrite (прописывается в файле .htaccess):
Ставшая классической задача слияния имена сайта с www и без него, решается так:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursite\.com
RewriteRule ^(.*)$ http://www.yoursite.com/$1 [R=permanent,L] .
или альтернативный синтаксис:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
Обозначение [R=301,L] означает: перенаправить клиента и отправить ему код статуса 301 (R=301) и сделать это правило последним (L).
Редирект старого домена на новый:
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]
Например, если необходимо чтобы вместо rewrite.htm загружался файл rewrite.html, добавьте в .htaccess:
RewriteEngine on
RewriteBase /
RewriteRule ^rewrite\.htm$ rewrite.html [R=permanent]
Для замены всех .htm файлов .html файлами:
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)\.htm$ $1.html [R=permanent]
Редирект на PHP:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.newdomain.ru/newdir/newpage.htm");
exit();
?>
Лучше указать HTTP/1.1, так как более старые не поддерживают виртуальный хостинг. Не забудьте, что до вызова header, ничего не должно выводиться (например, echo или print). Поэтому этот код лучше ставить в начало php-скрипта. Более полный вариант php редиректа с сохранением передаваемой страницы и параметров вызова:
<?
$ref=$_SERVER['QUERY_STRING'];
if ($ref!='') $ref='?'.$ref;
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://newdomain.com/'.$ref);
exit();
?>
Редирект на ASP
<%@ Language=VBScript %>
<%
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", "http://www.new-url.com"
response.end
%>
Редирект на ASP.NET
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://www.new-url.com");
}
</script>
Редирект на ColdFusion
<.cfheader statuscode="301" statustext="Moved permanently">
<.cfheader name="Location" value="http://www.new-url.com">
Редирект с помощью meta refresh
<meta http-equiv='refresh' content='0; url=http://newdomain.com'>
где 0 - задержка переадресации в секундах, newdomain.com -страница, куда переадресуем. Некоторые старые браузеры не поддерживают meta refresh со значением 0, для совместимости можно установить ненулевой значение, хотя, на мой взгляд это уже не актуально. Такой редирект не сможет склеить ваши сайты (с www и без) и передать PR, так как игнорируется поисковыми системами. Он возвращает код 200 OK, что соответствует обычной странице. Эта техника популярна у спамеров, поэтому ее стоит применять только для страниц, которые не будут индексироваться.
Редирект с помощью JavaScript
Варианты переадресации на JavaScript чаще реализуются с использованием функции setTimeout('функция', задержка).
Например, автоматически сделать Click на кнопке "Submit" формы "searchform" через 0.1 сек после загрузки кода:
setTimeout('document.forms["searchform"].Submit.click()', 100);
На кнопку "Submit" можно повесить любое действие, например, открыть новый url в этом окне. Кстати такое редиректы чаще встречаются при организации Дорвеев (DorWay) - браузер Пользователя будет переадресован на другую страницу, а поисковый робот, который "не понимает" JavaScript, будет индексировать эту страницу, недоступную пользователю. На ней дорвейщики размещают текст, напичканный "нужными" ключевыми словами.
Чтобы просто переадресовать на другую страницу можно вставить после один из вариантов кода на JavaScript:
location="http://www.newdomain.com";
document.location.href="http://www.newdomain.com";
window.location.reload("http://www.newdomain.com");
document.location.replace("http://www.newdomain.com");
В последнем случае уже нельзя будет вернуться на страницу выполнившую переадресацию, так как ее адрес стирается из history, что нередко и нужною. Если нужна задержка по времени, можно оформить location="http://www.newdomain.com"; в виде функции и вставить ее в setTimeout('функция()', задержка_в_мсек); Редирект на JavaScrupt не является 301 редиректом и не передаст PR страницы, не сможет обеспечить ее склейку.
Отметим дополнительно некоторые особенности редиректов:
Методы редиректа с .htaccess работают только на Linux серверах, имеющих Apache с включенным модулем Mod-Rewrite.
Использование .htaccess создает дополнительную нагрузку на сервер Apache, более эффективно прописывать те же команды в его конфигурационном файле hpptd.conf, но, как правило, к нему нет доступа у вебмастера.
301 редирект, позволяет сберечь трафик и передать PR страницы для поисковых систем (для Google точно).
процесс склейки и передачи PR занимает длительное времени - до нескольких месяцев и также зависит от поисковой системы, поэтому не удаляйте старую страницу или сайт, пока не произойдет окончательный перенос.
некоторые поисковые системы требуют для склейки сайтов дополнительных настроек, например, для Яндекса нужно дополнительно прописывать robots.txt
Заключение. Безопасный способ редиректа старых страниц на новые или старого сайта на новый адрес, с сохранением позиций в поисковых системах, заключается в использование 301 редиректа, который также позволит вам передать старый Page Rank страницы на новый сайт.
Директивы простого перенаправления (редирект)
Наиболее часто используемые, и наиболее сложные директивы .htaccess. Предположим мы хотим при запросе нашего сайта переадресовать пользователя на другой URL, для этого нам необходимо в корневую директорию сайта добавить файл .htaccess со следующим содержимым
Redirect / http://www.example.com
# http://www.example.com - URL На который мы перенаправляем запросы
более сложный пример, мы хотим определенные страницы нашего сайта переадресовывать на другие сайты
Redirect /linux http://www.linux.org
Redirect /linux/download.html http://www.linux.org/dist/download_info.html
Redirect 301 /kernel http://www.linux.org
теперь при наборе http://mysite.ru/linux будут открываться http://www.linux.org. В последнем примере WEB сервер будет передавать код 301, что означает "документ перемещен постоянно".
Синтаксис команды Redirect выглядит следующим образом:
Redirect [status] URL_LOCAL URL_REDIRECT
status : необязательное поле, определяет код возврата, допустимые значения:
* permanent (301 — документ перемещен постоянно)
* temp (302 — документ перемещен временно)
* seeother (303 — смотрите другой)
* gone (410 — убран)
URL_LOCAL : локальная часть URL запрашиваемого документа.
URL_REDIRECT : URL куда должен быть выполнен редирект.
Директива RedirectMatch аналогична директиве Redirect за исключением того, что в RedirectMatch возможно использование регулярных выражений, что несомненно может быть удобно в некоторых условиях. Например для организации передачи параметров скрипту в теле URL.
RedirectMatch /(.*)/(.*)/index.html$ http://mysite.ru/script.php?par1=$1&par2=$2
Хотя данный пример и вызовет перезагрузку страницы в дальнейшем его можно будет улучшить. Здесь необходимо сделать небольшое лирическое отступление и поговорить о синтаксисе регулярных выражений.
В регулярном выражении можно использовать любые печатные символы и пробел, но часть символов имеет особое значение:
- Круглые скобки () используются для выделения групп символов. В дальнейшем к ним можно обращаться по номеру.
- Символ ^ обозначает начало строки.
- Символ $ обозначает конец строки.
- Символ . обозначает любой символ.
- Символ | обозначает альтернативу. Например, выражения "A|B" означают "A или B".
- Символ ? ставится после символа (группы), который может как присутствовать, так и отсутствовать.
- Символ * ставится после символа (группы), который может отсутствовать или присутствовать неограниченное число раз подряд.
- Символ + действует аналогично символу * с той лишь разницей, что предшествующий ему символ обязательно должен присутствовать хотя бы один раз.
- Квадратные скобки [] используются для перечисления допустимых символов.
- Квадратные скобки [^] используются для перечисления недоступных символов.
- Символ \ ставится перед спецсимволами, если они нужны в своем первозданном виде.
- Все, что расположено после символа '#', считается комментарием.
Индексные страницы
Когда пользователь заходит на хост например
http://gentoo.org принято, что открывается индексный файл index.* при его отсутствии - либо содержимое каталога, либо ошибку 403 (
FORBIDDEN) если опция отключена - запрещен просмотр директорий.
За листинг файлов отвечает директива
Indexes (показывать посетителю список файлов, если в выбранном каталоге нет файла
index.html или его аналога).
Иногда нужно сделать так, чтобы в случае отсутствия в каталоге файла, который показывается по умолчанию, листинг, то есть список файлов в каталоге, не выдавался. В этом случае добавим в
.htaccess такую строчку:
А чтобы выдавал листинг, нужно:
Если же понадобиться разрешить просматривать список файлов, но чтобы при этом чаcть файлов определенного формата не отображалась, то запишем:.
Выдает листинг каталога, т.е. его содержание со всем содержанием, за исключением файлов-скриптов
PHP и
Perl.
Если ваш веб-сайт построен на скриптах, то в качестве индексных часто могут использоваться файлы с другими расширениями - указать эти файлы можно с помощью директивы
DirectoryIndex .
DirectoryIndex index.html index.shtml index.pl index.cgi index.php
|
Если же вы хотите что бы при обращении к каталогу открывался не
index.html, а например, файл
htaccess.php или
/cgi-bin/index.pl:
DirectoryIndex htaccess.php /cgi-bin/index.pl
|
Обработка ошибок
В ходе работы сервера иногда возникают ошибки, скорее это будет правильней назвать не сбоями в работе сервера, а стандартными кодами возврата оговоренными в стандарте HTTP_RFC2616. Вообще, в RFC ошибки называются "Status Codes", но мы их будем называть именно ошибками - так привычнее.
Код возврата - это трехзначное число, на основании которого можно судить о том, насколько успешно был обработан запрос. Код возврата начинающиеся на 1,2,3 считаются успешными, остальные причисляются к разряду ошибок.
Вот список ошибок 4xx и 5xx :
400 - Bad Request
401 - Unauthorized
402 - Payment Required
403 - Forbidden
404 - Not Found
405 - Method Not Allowed
406 - Not Acceptable
407 - Proxy Authentication Required
408 - Request Time-out
409 - Conflict
410 - Gone
411 - Length Required
412 - Precondition Failed
413 - Request Entity Too Large
414 - Request-URI Too Large
415 - Unsupported Media Type
500 - Internal Server Error
501 - Not Implemented
502 - Bad Gateway
503 - Service Unavailable
504 - Gateway Time-out
505 - HTTP Version not supported
При возникновении ошибки 4xx или 5xx посетитель Вашего сайта увидит в браузере сообщение от сервера, которое врядlли можно назвать предельно понятным рядовому пользователю. Apache предоставляет возможность выдать вместо аскетичного технического текста, не изобилующего деталями, свою страницу, где Вы можете человеческим языком объяснить пользователю, что произошло и что делать.
Пример переопределения страниц ошибок приведен ниже:
# содержание файла .htaccess:
ErrorDocument 404 http://bg10.ru/error/404.htm
ErrorDocument 403 http://bg10.ru/error/403.htm
ErrorDocument 400 http://bg10.ru/error/400.htm
ErrorDocument 500 http://bg10.ru/error/500.htm
# в случае ошибки "FORBIDDEN" показывается текстовое сообщение, которое
# обязательно должно начинаться с кавычки, кавычка в сообщении не выводится:
ErrorDocument 403 "Sorry can't allow you access today, 403 Status Codes Apache"
Кодировка
Иногда браузер пользователя не может корректно определить тип кодировки выдаваемого документа. Для решения этой проблемы используемая кодировка указывается в настройках Web сервера Apache и заголовке передаваемого документа. Причем для корректного распознания эти кодировки должны совпадать. На наших серверах по умолчанию используется кодировка cp1251
В HTML для указания кодировки используется тег:
<meta http-equiv="content-type" content="text/html; charset=Windows-1251">
Наиболее часто встречаются типы кодировки для русского языка передаваемые в заголовке документа:
Windows-1251 - Кириллица (Windows).
KOI8-r - Кириллица (КОИ8-Р)
cp866 - Кириллица (DOS).
Windows-1252 - Западная Европа (Windows).
Windows-1250 - Центральная Европа (Windows).
UTF-8 - двух байтовая кодировка
Теперь рассмотрим указание кодировки по умолчанию через .htaccess. AddDefaultCharset задает дефолтную таблицу символов (кодировку) для всех выдаваемых страниц на веб сервере Apache. Указываем кодировку на все файлы, в которой по умолчанию получает документы браузер:
AddDefaultCharset WINDOWS-1251
При загрузке файла на сервер, возможна перекодировка, его - указываем, что все получаемые файлы будут иметь кодировку windows-1251, для того что бы указать кодировку на загружаемые файлы напишем:
CharsetSourceEnc WINDOWS-1251
Если необходимо отменить перекодировку сервером файлов:
CharsetDisable on
Управление доступом
Очень часто возникает необходимость запретить доступ к определенным файлам или папкам для определенных груп пользователей. В Web сервере Apache есть встроенные средства для решения данной проблемы.
Для запрета или разрешения доступа ко всем файлам и папкам в текущей и во всех вложенных директориях используется директива Order синтаксис ее очень прост:
Order [Deny,Allow] | [Allow,Deny]
# По умолчанию Deny,Allow
В зависимости от того в каком порядке указаны директивы меняется логика работы сервера. В случае если Deny,Allow то запрещается доступ со всех IP кроме оговоренных, в случае если Allow,Deny разрешается доступ со всех IP кроме оговоренных. Далее должны идти секции описания для доступа и запрета. Ключевое слово all означает со всех IP
Например мы хотим запретить (блокировать) доступ с IP 81.222.144.12 и 81.222.144.20 и разрешить всем остальным нам необходимо добавить в .htaccess следующий код:
Order Allow,Deny
Allow from all
Deny from 81.222.144.12, 81.222.144.20
Для обратной ситуации когда мы хотим запретить доступ со всех IP кроме 81.222.144.12 и 81.222.144.20 нам необходимо добавить в .htaccess следующий код:
Order Deny,Allow
Deny from all
Allow from 81.222.144.12, 81.222.144.20
Запрет или разрешение на доступ можно указывать не только на все файлы, но так же можно указывать на отдельный файл или группы файлов. Например мы хотим запретить доступ всех пользователей кроме IP 81.222.144.12 к файлу passwd.html который расположен в текущей директории.
<Files "passwd.html">
Order Deny,Allow
Deny from all
Allow from 81.222.144.12
</Files>
Так же можно запретить или разрешить доступ к определенной группе файлов. Например к файлам с расширением ".key":
<Files "\.(key)$">
Order Deny,Allow
Deny from all
Allow from 81.222.144.12
</Files>
Паролирование директорий
.htaccess можно так же использовать для установки пароля на доступ к определенным папкам, файлам и группам файлов. Приведем рабочий пример, а потом поясним все содержимое:
AuthName "Protected area, need authorization"
AuthType Basic
AuthUserFile /home/t/test/.authfile
require valid-user
Данный файл нужно положить в ту директории, на которую мы хотим поставить пароль.
Директива AuthName выводит сообщение при запросе пароля, все сообщение необходимо писать в одну строчку, синтаксис директивы тривиален:
AuthName "SEE TEXT"
Директива AuthType выбирает тип аутентификации. Возможны следующие типы: Basic или Digest. Второй может не поддерживаться некоторыми браузерами, поэтому пользоваться им не рекомендуется.
AuthType Basic | Digest
AuthUserFile указывает имя файла с паролями для аутентификации пользователей (пароли в этом файле будут шифрованными). Путь к файлу с паролями задается относительно корня веб-сервера. Храните файл с паролями в папке, доступ к которой закрыт для пользователей - (желательно поместить этот файл вне иерархии вашего веб-сайта).
Создать данный файл можно двумя способами. Если у Вас установлена операционная система семейства Windows вы можете скачать отсюда программу которая генирирует данный файл. Либо подключится к серверу по SSH (инструкцию по подключению можно найти тут) и воспользоваться утилитой htpasswd.
Запустив htpasswd без параметров мы увидим:
beget@ginger ~ # htpasswd
Usage:
htpasswd [-cmdps] passwordfile username
htpasswd -b[cmdps] passwordfile username password
-c Create a new file.
beget@ginger ~ #
Здесь не будут рассматриваться все параметры этой команды, но вы можете сами прочитать подробности, запустив htpasswd в unix shell или ознакомившись с соответствующей страницей документации по Apache.
Итак, изначально у нас еще нет файла с паролями и нам нужно его создать:
beget@ginger ~ # htpasswd -c authfile test1
New password:
Re-type new password
Adding password for user test1
beget@ginger ~ #
Здесь не будут рассматриваться все параметры этой команды, но вы можете сами прочитать подробности, запустив htpasswd в unix shell или ознакомившись с соответствующей страницей документации по Apache.
После выполнения данной операции htpasswd создаст файл passwords, в котором окажется пользователь test1 и его пароль в зашифрованном виде:
beget@ginger ~ $ cat .authfile
test1:zgco1KREjBY8M
beget@ginger ~ $
А теперь мы хотим добавить еще одного пользователя. Так как файл с паролями у нас уже есть, мы просто не будем использовать ключ '-c' :
beget@ginger ~ # htpasswd .authfile test2
New password:
Re-type new password:
Adding password for user test2
beget@ginger ~ $ cat .authfile
test1:zgco1KREjBY8M
test2:eN3uA6t0kzV1c
beget@ginger ~ $
Вернемся к описанию директив паролирования директорий. Директива Require определяет пользователей, которые могут получить доступ
Require USER_NAME | valid-user
Указывая valid-user вы разрешаете доступ всем пользователям, перечисленным в файле паролей.
Приведем пример для доступа определенных пользователей из файла с паролями .htpasswd
AuthName "Protected area, need authorization"
AuthType Basic
AuthUserFile /home/t/test/.authfile
require Alexey Kondr Fenix
Так же как и с запретом доступа по IP здесь можно использовать расширение <Files> ниже приведены два примера: установки пароля на группу файлов и на один определенный файл.
<Files "passwd.html">
AuthName "Protected area, need authorization"
AuthType Basic
AuthUserFile /home/t/test/.authfile
require valid-user
</Files>
<Files "\.(key)$">
AuthName "Protected area, need authorization"
AuthType Basic
AuthUserFile /home/t/test/.authfile
require valid-user
</Files>
Следует помнить, что при таком ограничении доступа пароли передаются по каналам связи в открытом виде и при определенных обстоятельствах могут быть перехвачены злоумышленниками. Поэтому в целях безопасности рекомендуется организовывать доступ к закрытым областям веб-сайта через защищенное SSL-соединение.
Указание опций PHP
Директивы для конфигурирования PHP можно размещать не только в файле php.ini, но также и в конфигурационных файлах Apache для вашего сайта – .htaccess. Это позволяет проводить тонкую настройку php для разных директорий.
Для работы с PHP в конфигурационных файлах Apache доступны 4 директивы: php_value, php_flag, php_admin_value, php_admin_flag, которые отличаются значимостью, типом устанавливаемых значений и местом применения.
Директивы php_admin_value, php_admin_flag выставляются только в файле httpd.conf, так что нам они не интересны. По сути данные директивы переопределяют значение остальных директив.
Директивыа php_flag служит для установки логических значений директив в php.ini. В то время как директива php_value служит для установки строковых и числовых значений директив php.ini, т.е. любых типов значений, за исключением логических.
Синтаксис директив очень прост:
php_flag имя директивы on | off
php_value имя директивы VALUE
Приведем перечень наиболее часто используемых директив
mysql.default_host
Устанавливает имя хоста базы данных.
Пример: php_value mysql.default_host localhost
mysql.default_user
Устанавливает имя пользователя базы данных
Пример: php_value mysql.default_user alexey
mysql.default_password
Устанавливает пароль пользователя базы данных
Пример: php_value mysql.default_password Hry5Gw2
display_errors
Разрешает вывод ошибок и предупреждений в браузер.
Пример: php_flag display_errors 0
display_startup_errors
Включает отображение ошибок, возникающих при запуске PHP.
Пример: php_flag display_startup_errors 0
error_reporting
Определяет типы (уровени важности) фиксируемых ошибок.
Пример: php_value error_reporting “E_ALL & ~E_NOTICE”
auto_prepend_file
Определение файла, который будет выводится в начале каждого php-скрипта. Путь указывается от корня файловой системы сервера.
Пример: php_value auto_prepend_file /www/server/prepend.php
auto_append_file
Определение файла, который будет выводится в конце каждого php-скрипта.
Пример: php_value auto_append_file /www/server/append.php
sendmail_from
Устанавливает e-mail отправителя, который применяется при отправке почтовых сообщений с помощью PHP.
user_agent
Устанавливает строку User-agent, которая используется PHP при обращении к удаленным серверам.
Пример: php_value user_agent “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)”
Например для вывода всех сообщений об ошибках генерируемых php в .htaccess нужно прописать следующие строки:
php_flag display_errors 1
php_flag display_startup_errors 1
php_value error_reporting “E_ALL & ~E_NOTICE”
Для запрещения выполнения php в текущей директории и во всех вложенных необходиомо в .htaccess прописать следующие строки:
php_flag engine off
Q.
Запрет на загрузку изображений
A.
1.
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.example.com/images/.*$ [NC]
RewriteRule .*\.gif$ - [F]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !.*/foo-with-gif\.html$
RewriteRule ^inlined-in-foo\.gif$ - [F]
------------
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.example.com/.*$ [NC]
RewriteRule .*\.jpg$ /img/example.gif [NC]
2.
SetEnvIf REFERER "www\.mydomain\.com" linked_from_here
SetEnvIf REFERER "^$" linked_from_here
<Directory /www/images>
Order deny,allow
Deny from all
Allow from env=linked_from_here
</Directory>
3.
SetEnvIf Referer "^http://www.example.com/" local_referal
# Allow browsers that do not send Referer info
SetEnvIf Referer "^$" local_referal
<Directory /web/images>
Order Deny,Allow
Deny from all
Allow from env=local_referal
</Directory>
4.
Еще один варинат запрета доступа к картинкам с неразрешенных сайтов:
SetEnvIfNoCase Referer "^$" local_ref=1
SetEnvIfNoCase Referer "^http://(www\.)?htmlweb\.ru" local_ref=1
SetEnvIfNoCase Referer "^http://(www\.)?images\.yandex\.ru" local_ref=1
SetEnvIfNoCase Referer "^http://(www\.)?hghltd\.yandex\.com" local_ref=1
<FilesMatch ".(jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
Q.
Как запретить выполнение скриптов
A.
1. RemoveHandler .pl .cgi .php .php3 и т.д.
2. RemoveType .pl .cgi .php .php3
Q.
Oграниечнный доступ к папке
Есть папка, нужно сделать банально ограниечнный доступ к ней.
Сайт хостится на valuehost.
Управление правами из .htaccess включил.
собственно файлик .htaccess:
"
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /htdocs/scripts/.htpasswd
require valid-user
"
.htpasswd генерил htpasswd.exe -cm
При попытке доступа к папке, как положенно выдается окошко ввода юзера и пароля, вводим всё это, пароль не принимает.
В логах пишет, что не может найти .htpasswd:
"
(2)No such file or directory: Could not open password file: /htdocs/scripts/.htpasswd
user dusk not found: /scripts/
"
A.
Укажите полный путь к htpasswd, т.е.
/pub/home/ваш_логин/......
Q.
проблема с просмотром DjVu:
Есть DjVu файл.
Пока не закачать его на сервер, с ним все в порядке,т.е. в IE6 из локальной он открывается нормально.
Закачиваю его по ftp на сервер и пытаюсь открыть его оттуда. На что IE6 долго думает и в конце говорит DjVu plugin error или что-то типа этого (в зависимости от
версии этого самого DjVu plugin).
Попытался сохранить этот файл с помощью того же IE6,а потом открыть - результат тот же, не открывается.
Я сравнил исходный файл и файл после закачки-выкачки (выкачивалне по ftp, а IE6), оказалось, что все байты '00' в исходном
файле заменены на '20'.Что с этим делать?
A.
впишите в .htaccess
CharsetDisable On
Q.
Как запретить залить любой вебшелл
A.
Запретите выполнение скриптов (отключить php, cgi, exec и т.д.) ну и также изменение свойств папки по средствам htaccess
Q.
Bиртуальный домен третьего уровня
есть домен такого класса www.domen.ru на сервере есть папка down
и все это доступно по адресу www.domen.ru/down/
вопрос в том как сделать вот эту самую папку down доступной не как папку а как домен третьего уровня, через .htaccess
A.
RewriteEngine On
RewriteRule ^http://www.poddomen.domen.ru$ http://domen.ru/poddomen
RewriteRule ^http://www.poddomen.domen.ru$ http://www.domen.ru/poddomen
Варианты создания поддоменов.
RewriteEngine On
RewriteRule ^poddomen/ - [L]
RewriteCond %{HTTP_HOST} (www.)?poddomen.domen.ru [NC]
RewriteRule (.*) poddomen/$1 [L]
-------------------------------------
RewriteCond %{HTTP_HOST} (www\.)?poddomen\.domen\.ru$
RewriteCond %{REQUEST_URI} !^(/)?poddomen/
RewriteRule ^(.*)$ poddomen/$1
-------------------------------------
RewriteEngine On
RewriteCond %{ENV:REDIRECT_VHOST} ^$
RewriteCond %{HTTP_HOST} ^(www\.)?poddomen\.domen\.ru$
RewriteRule ^(.*) poddomen/$1 [L,E=VHOST:1]
-------------------------------------
RewriteEngine on
RewriteCond %{HTTP_HOST} ^poddomen\.domen.ru$ [NC]
RewriteCond %{REQUEST_URI} !poddomen/
RewriteRule ^(.*)$ poddomen/$1
-------------------------------------
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{ENV:REDIRECT_MYFLAG} ^$
RewriteCond %{HTTP_HOST} ^poddomen\.domen\.ru$
RewriteRule ^(.+) %{HTTP_HOST}$1 [E=MYFLAG:1]
RewriteRule ^poddomen\.domen\.ru(.*) /poddomen%{REQUEST_URI} [L]
-------------------------------------
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^poddomen\.domen\.ru$
RewriteCond %{REQUEST_URI} !/poddomen/
RewriteRule ^(.*)$ /poddomen/$1 [L]
-------------------------------------
RewriteEngine On
RewriteCond %{THE_REQUEST} /poddomen/[^/]
RewriteRule ^poddomen/[^/]+/(.*) /$1 [R=permanent,L]
RewriteCond %{HTTP_HOST} ^(.+)\.domen\.ru$ [NC]
RewriteCond %{HTTP_HOST} !^www\.domen\.ru$ [NC]
RewriteCond %{REQUEST_URI} !^/poddomen
RewriteRule ^(.*)$ /poddomen/%1%{REQUEST_URI} [L]
-------------------------------------
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/poddomen
RewriteCond %{HTTP_HOST} ^poddomen.domen.ru
RewriteRule ^(.*)$ poddomen/$1 [L]
-------------------------------------
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.+).domen.ru$ [NC]
RewriteCond %{HTTP_HOST} !^www.domen.ru$ [NC]
RewriteCond %{REQUEST_URI} !^/poddomen.domen.ru
RewriteRule ^(.*) %{HTTP_HOST}$1
RewriteRule ^(.*).domen.ru(.*) /poddomen/$1$2
RewriteRule ^poddomen.domen.ru.(.*) /poddomen/$1
Q.
Дата изменения в htaccess
Что надо прописать чтобы подставлялась дата модификации?
A.
Options +Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
или какие ты файлы для инклюда разрешиш...
в *.shtml (любой с таким расширением)
последняя можификация файла .htaccess была <!--#flastmod file=".htaccess" -->
а этот файл был изменен <!--#echo var="LAST_MODIFIED" -->
Q.
Как отдавать .php как простой текст, т.е. в обход интерпретатора php?
A.
RemoveHandler .php
AddType text/plain .php
Q.
.htaccess для папки вне htdocs (alias)
A.
в настройках домена выбираем папку /cgi-bin/ (там может что нить вроде create(new) folder) и ставим галку - что слушаться .хтакцесс
Q.
Бинарный файл:подскажите директиву, которую нужно прописать в .htaccess, чтобы апач открывал все файлы с расширением, например, "ext", как бинарные.
A.
AddType application/ octet-stream ext
Q.
.htaccess и php_flag: необходимо отключить session.use_trans_sid по причине вмешательства PHPSESSID в линк при старте сессии.
A.
php_flag session.use_only_cookies On
php_flag session.use_trans_sid Off
Пример .htaccess для создания ЧПУ
############################################################################################
#
# Переадресация обработки ошибки
# Директива ErrorDocument служит для указания серверу сценария обработки ошибок
# Формат: ErrorDocument <код ошибки> <путь к скрипту-обработчику>
#
############################################################################################
ErrorDocument 404 /errors/error404.html
#ErrorDocument <code> /errors/error<code>.html
############################################################################################
#
# Врубаем движок перезаписи
# Перезапись производится следующим образом:
# На каждый модуль - отдельная виртуальная папка
# Виртуальная папка создается путем создания правила для определенных URL, например,
# хотим создать папку /user/ тогда пишем правило:
#
# RewriteRule ^user[/](.*)[/](.*).html[/]$ ./index.php?module=user¶m=$1&page=$2 [QSA]
# RewriteRule ^user[/](.*).html[/]$ ./index.php?module=user&page=$1 [QSA]
#
# Здесь первая строка указывает что адреса вида
# http://www.domain.ru/user/somedir/somefile.html
# http://www.domain.ru/user/somedir/
# будут переписаны как
# http://www.domain.ru/index.php?modu...p;page=somefile
# http://www.domain.ru/index.php?modu...p;page=somefile
#
# Далее один уровень - подкаталогов
# Далее файл с расширением .html
# Вид урла: http://www.domain.ru/module/somefilder/somefile.html
#
############################################################################################
#<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
############################################################################################
#
# Директива RewriteBase указывает физический путь относительно которого будут располагаться
# перезаписываемые страницы.
#
############################################################################################
RewriteBase /
############################################################################################
#
# Запрещаем доступ к файлам .htaccess и директориям
# Как работает RewriteRule
# Формат: RewriteRule <разбор входящей (перезаписываемой) строки> <составление новой (записываемой) строки>
# Разбор вх. строки производится при помощи спец. символов:
#
# Текст:
# . - один символ (в данном месте стоит какой-либо символ)
# [chars] - один из символов (в данном месте стоит один из перечисленных символов)
# [^chars] - ни один из символов (в данном месте не стоит ни одного из перечисленных символов)
# text1|text2 - Либо text1, либо text2
#
# Повторители:
# ? - 0 или 1 раз повторяетсяпредшествующий текст
# * - 0 или N раз повторяетсяпредшествующий текст
# 1 - 0 или N раз повторяетсяпредшествующий текст
#
# Якори:
# ^ - Начало разбираемой строки
# $ - Конец разбираемой строки
#
# Экранирование:
# \char - Возможно такое, что служебные символы будут присутствовать в перезаписываемом тексте
# и чтобы возможно было разобрать подобное выражение нужно будет указать, чтобы они не принимались
# за служебные, это производится установкой перед ними обратного слеша (экранирование)
# Например: ^/\((.*)\)/$ будет проинтерпретирован как строка запроса /(sometext)/ и из нее
# в переменную $1 будет помещен текст sometext
#
############################################################################################
RewriteRule ^.htaccess - [F] # незачем знать, что написано в этом самом файле хотя он вроде по умолчанию недоступен
RewriteRule ^admin - [F] # нех лазить по физической директории CMS
RewriteRule ^settings.php - [F] # нех лазить по файлу с настройками
############################################################################################
#
# разрешаем доступ к существующим файлам и директориям (если это требуется)
# Директива RewriteCond. Это своего рода условный оператор
#
# Формат: RewriteCond %{NAME_OF_VARIABLE} ^formated-string*
#
# NAME_OF_VARIABLE - это предопределенные переменные перечисленные ниже
#
# HTTP-заголовки:
#
# HTTP_USER_AGENT
# HTTP_REFERER
# HTTP_COOKIE
# HTTP_FORWARDED
# HTTP_HOST
# HTTP_PROXY_CONNECTION
# HTTP_ACCEPT
#
# Коннекты и запросы:
#
# REMOTE_ADDR
# REMOTE_HOST
# REMOTE_USER
# REMOTE_IDENT
# REQUEST_METHOD
# SCRIPT_FILENAME
# PATH_INFO
# QUERY_STRING
# AUTH_TYPE
#
# Внутренние переменные сервера:
#
# DOCUMENT_ROOT
# SERVER_ADMIN
# SERVER_NAME
# SERVER_ADDR
# SERVER_PORT
# SERVER_PROTOCOL
# SERVER_SOFTWARE
#
# Системные переменные:
#
# TIME_YEAR
# TIME_MON
# TIME_DAY
# TIME_HOUR
# TIME_MIN
# TIME_SEC
# TIME_WDAY
# TIME
#
# Специальные:
#
# API_VERSION
# THE_REQUEST
# REQUEST_URI
# REQUEST_FILENAME
# IS_SUBREQ
#
# Пример:
# RewriteCond %{REMOTE_HOST} ^host1.* [OR,NC]
# RewriteCond %{REMOTE_HOST} ^host2.* [OR,NC]
# RewriteCond %{REMOTE_HOST} ^host3.* [NC]
# RewriteRule ^/$ - [F]
# Запрещаем вход на сайт с хостов host1,host2,host3
#
# Есть два полезных флага [OR] означает чтото типа "или следующее условие"
# это если их два или более подряд идущих и выполняться должно хотябы одно из них,
# и флажок [NC] - назначение "не учитывать регистр"
#
# Насамом деле RewriteCond я бы использовал для того, чтобы ограничивать/расширять доступ
# юзерам/агентам, в зависимости от параметров содержащихся в переменных, которые они
# приносят вместе с собой
# То есть, роботов и гостей с опредеделенных IP , например, блокируем, Другие гостям с опять же
# определенных адресов обрабатываем одним скриптом, оставшихся по умолчанию
#
############################################################################################
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
############################################################################################
#
# добавляем слеш в конце пути. Это необходимо для того, чтобы ссылки вида:
#
# http://www.domain.ru/news
# и
# http://www.domain.ru/news/
#
# обрабатывались одинаково
#
RewriteRule ^(.+[^/])$ $1/ [QSA]
############################################################################################
#
# обработка директории ошибки
# один скрипт на обработку всех ошибок, в нем можно ставить редиректы, чтобы пользователю
# не выдавались пресловутые надписи о невозможности чего-либо при помощи вашего сайта,
# а предлагалось бы найти информацию воспользовавшись поиском
#
RewriteRule ^errors/error(.*).html[/]$ ./errors/error.php?code=$1 [QSA]
############################################################################################
#
# обработка директории модуля USER
#
RewriteRule ^user[/](.*)[/](.*).html[/]$ ./index.php?module=user¶m=$1&page=$2 [QSA]
RewriteRule ^user[/](.*).html[/]$ ./index.php?module=user&page=$1 [QSA]
############################################################################################
#
# обработка директории модуля ADMINISTRATOR
# папка Content Management System (CMS) расположена произвольно, адрес доступа
# http://www.domain.ru/administrator/index.php
#
RewriteRule ^administrator[/]index.php[/]$ ./admin/index.php [QSA]
############################################################################################
#
# обработка корневой директории. так как это последнее правило, то тут необходимо исключить
# возможное включение слешей в пути к странице, другими словами, чтобы было невозможно обработать
# путь вида http://www.domain.ru/somedir/somedir/file.html, если не найдена ни одна из выше
# обрабатываемых директорий, делаем это исключением из пути слешей записью [^/]
#
RewriteRule ^([^/]+).html[/]$ ./index.php?page=$1 [QSA]
#</IfModule>
############################################################################################
#
# Теперь как все должно быть в коде...
# Смысл этого всего в том, чтобы будь то поисковик будь то реальный пользователь не видел
# охрененных URLов типа http://www.domain.ru/index.php?m=ne...11&id=12345
# и при этом, трудно воспроизводимых.
#
# Следовательно, при использовании mod_rewrite ваш скрипт должен генерить ссылки вида:
# http://www.domain.ru/news/14112005/hotnews.html
# а принимать ссылку вида
# http://www.domain.ru/index.php?modu...ategory=hotnews
# Ну или такую ссылку которую вы задумаете и опишите в этом файле
Q.
Необходимо сделать следующее средствами .htaccess и RewriteEngine on
При запросе: http://www.site.ru/index.html чтобы открывалось http://www.site.ru/
A.
Код
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^/index\.html$
RewriteRule ^(.*)$ http://site.ru/ [R=301,L]
Q.
Как перенаправить с http на https
как сделать чтобы перенаправлялось с http:// на https:// только для определенной страницы, то есть есть страница http://test.com/page.com, чтобы при обращении к ней происходило перенаправление на https://test.com/page.com ?
A.
Код
RewriteEngine on
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteRule ^page.com$ https://test.com/page.com [R=301,L]
Q.
Как подправить url через mod_rewrite: если урл заканчивается на "/", дописать к нему "index.html"
A.
RewriteRule ^(.*)/$ $1/index.html [L]
If you wish to redirect your .html or .htm pages to.shtml pages because you are using Server Side Includes(SSI) add this code to your .htaccess file:
AddType text/html .shtml
AddHandler server-parsed .shtml .html .htm
Options Indexes FollowSymLinks Includes
DirectoryIndex index.shtml index.html
Убираем слеш в конце пути
RewriteCond %{REQUEST_URI} ^([^.]+)/$
RewriteRule ^[^.]+/$ /%1 [QSA,L]
- Убрать слеш в конце строки
-
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^(.*)/$
RewriteRule ^(.*)$ /$1?%1 [R=301,L]
RewriteRule ^(.*)/$ /$1 [R=301,L]
-
- Есть URL формата:
domain.ru/chto/ugodno?test=123
domain.ru/kak/ugodno?test2=123
Как удалить все то что после ? включая и сам знак.
- RewriteCond %{THE_REQUEST} \?
RewriteRule ^ http://domain.ru\%{REQUEST_URI}? [R=301,L]
Q
Как известно, существует проблема связи URI из html с XML в спец. символах. Так символ "&" в html означает часть строки запроса, переданного через URL методом GET. Например: "http://localhost/?page=general&sheet=11". С точки зрения XML данный URL не верен и у меня возникают проблемы при создании XML-файла карты сайта!
Вопрос следующий: после изменения символа "&" на "&" во всех своих ссылках, необходимо как-нибудь заменять его и в адресе, перед загрузкой страницы. Использовать PHP- считаю крайним методом (не хочется добавлять/менять лишний код)... А вот как можно это реализовать в .htaccess?
Я написал правило:
RewriteRule ^(.*)&(.*)$ http://localhost/?page=$1&$2
Оно хорошо работает когда адрес имеет следующий вид: "http://localhost/general&sheet=11", но мне нужно чтобы подмена производилась и в URI вида: "http://localhost/?page=general&sheet=11"
A
RewriteCond %{QUERY_STRING} ^(.*)&(.*)$
RewriteRule ^(.*)$ /$1?%1&%2 [R=301,L]
Редирект вставлен чисто для проверки.
Ну это у Вас и так получалось.
RewriteRule ^(.*)&(.*)$ /$1&$2 [R=301,L]
A.
Kаким правилом можно запретить запросы вида GET /track(.*)
Q.
RewriteRule ^track.* - [F]
A.
Вопрос по htaccess - надо написать правила для переадресации следующего типа:
для основного домена site.com переадресация на https
для поддомена demo.site.com - переход просто на http
RewriteCond %{HTTP_HOST} ^site.com
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} ^demo.site.com
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R,L]
ну вот как-то так я это написал, и по другому пробовал, в итоге для демо (https://demo.site.com) все равно идет страница с https, мол сертификата нету и т.д. Я так понимаю до htaccess оно даже не доходит, как-то это можно обойти?
Q.
Сначала устанавливается соединение http или https, и только потом сервер обрабатывает запрос, в т.ч. правила .htaccess. Соответственно, если сертификата нет, то переадресацию с https на http без предупреждения браузера сделать не получится. Вам нужен или дополнительный сертификат на этот хост или wildcard.
Q.
Хочу сделать редирект 301, но не выходит маска: с www.site.ru/stati/raznye_stati.htm на www.site.ru/klu4evik/raznye_stati.htm синтаксис в .htaccess Options +FollowSymLinks RewriteEngine on RewriteBase / RewriteRule ^stati(/?)(.*)?$ http://www.site.ru/klu4evik/$2 [L,R=301] Где ошибка?
A.
RewriteEngine on
RewriteBase /
RewriteRule ^stati(/?)(.*)?$ /slovo/$2 [L,R=301]
Q.
Kак закрыть от индексации все файлы с расширением html?
A.
можно запретить доступ бота пс к файлам с расширением .html:
создайте правило для нужной пс - типа
SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Googlebot" search_bot
затем пропишите запрет на доступ, например:
<Files "\.(html)$">
Order Deny,Allow
Allow from all
Deny from env=search_bot
</Files>
Q.
На хостинге лежат мои сайты. Вот один из них, допустим my-site.ru. Он доступен как по адресу my-site.ru , так и по адресу my-site-ru.maindomain.com (maindomain.com - это домен, который приобретается при покупке хостинга ). Так устроено у хостера. Нужно сделать, чтобы при запросе страницы, допустим, my-site-ru.maindomain.com/page1.html происходило перенаправление на my-site.ru/page1.html и.т.д - нужно это по понятной причине, т.к. яндекс , да и гугль иногда каким-то образом забредают на my-site-ru.maindomain.com и индексируют там копии страниц, из-за чего по основному адресу my-site.ru эти страницы могут вылетать из индекса. Host в Robots.txt прописан. Также сделал 301й редирект средствами htaccess:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^site-ru.maindomain.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.site-ru.maindomain.com$
RewriteRule ^/?$ "http\:\/\/my\-site\.ru" [R=301,L]
Но этот редирект, как выяснилось, действует только на морду сайта
A.
Нужно было сделать так:
RewriteCond %{HTTP_HOST} site-ru.maindomain.com$
RewriteRule ^(.*)$ http://my-site.ru/$1 [R=301,L]
Q.
Хочу, чтобы при обращении к www.mysite.ru первым делом открывалась не index.php, а htmlpage.php
A.
Надо положить в корень сайта файл .htaccess с таким содержимым.
PHP код:
DirectoryIndex htmlpage.php index.php
Если не поможет, попробуй так.
PHP код:
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ /htmlpage.php?REQUEST_URI=$1 [L,QSA]
</ifModule>
Q.
Есть урлы вида http://www.site.ru/topic403.html?sid...bde086d8f872dc
Надо, чтобы с этих урлов было перенаправление на страницы типа http://www.site.ru/topic403.html
То есть, берем страницу, в которой есть ?sid=что-то2 и перенаправляем ее на что-то
A.
RewriteCond %{QUERY_STRING} ^sid=(.*)$
RewriteRule ^(.*)$ $1? [R,L]
Поисковые машини и разного рода сканеры создают коллосальный трафик на вашем сайте. Нижеприведенный блок кода позволит запретить доступ ботам на сайт.
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' должны быть следующие записи:
(Теперь при запросе файла 'robots.txt' наш RewriteRule переадресует посетителя (робота) к обрабатывающему запросы скрипту robot.php. Кроме того, переменная передается скрипту, которая будет обработана в соответствии с вашими нуждами. 'REQUEST_URI' определяет имя запрашиваемого файла. В данном примере это - 'robots.txt'. Скрипт прочтет содержание 'robots.txt' и отправит его web-браузеру или роботу поискового сервера. Таким образом, мы можем считать хиты посетителей и вести лог-файлы.)
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^robots.txt$ /robot.php?%{REQUEST_URI}
Директивы кеширования
Кэширование для всех типов файлов по времени доступа
ExpiresActive on
ExpiresDefault "access plus 600 seconds"
Кэширование для всех типов файлов по времени изменения
ExpiresActive on
ExpiresDefault "modification plus 600 seconds"
Кэширование для определённых типов файлов
ExpiresByType text/css "modification plus 600 seconds"
ExpiresByType image/jpeg "modification plus 600 seconds"
ExpiresByType image/gif "modification plus 600 seconds"
ExpiresByType image/x-ico "modification plus 600 seconds"
ExpiresByType image/png "modification plus 600 seconds"
Запрет кеширования с помощью сервера Apache
Откройте файл конфигурации сервера Apache httpd.conf и раскомментируйте следующие строчки:
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
...
AddModule mod_expires.c
AddModule mod_headers.c
Впишите в .htaccess следующее:
# Запрещение кеширования в этой папке
# Необходимо включение модулей
# mod_headers.c и mod_expires.c
#
# Заголовок Cache-Control
<IfModule mod_headers.c>
Header append Cache-Control "no-store, no-cache, must-revalidate"
</IfModule>
# Заголовок Expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "now"
</IfModule>
Необходимые заголовки будут передаваться автоматически, и специально их писать в PHP уже не нужно - кэш уже выключен! В этом легко убедится, если посмотреть заголовки, передаваемые при запросе любого файла этой папки.
Кеширование с помощью файла .htaccess
# Разрешение кеширования в этой папке
# Необходимо включение модулей
# mod_headers.c и mod_expires.c
#
# Заголовок Cache-Control
<IfModule mod_headers.c>
Header append Cache-Control "public"
</IfModule>
# Заголовок Expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 hours"
#ExpiresDefault "access plus 10 years"
</IfModule>
Кеширование javascript файлов с помощью файла .htaccess
<FilesMatch .*\.js$>
ExpiresDefault "access plus 3 days"
</FilesMatch>
Будьте осторожны при кешировании, т.к. при изменении файла, пользователь может получить новый вариант только через 3 дня!
Поиск страниц больше чем в одном каталоге
Иногда необходимо позволить веб-серверу искать страницы больше чем в одном каталоге.
RewriteEngine on
# во-первых попытаемся найти это в указанном месте/...
# ...и если нашли то заканчиваем поиск:
RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /your/docroot/dir1/$1 [L]
# во-вторых - попытаемся найти это в pub/...
# ...и если нашли то заканчиваем поиск:
RewriteCond /your/docroot/dir2/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /your/docroot/dir2/$1 [L]
# иначе продолжаем для других директив
RewriteRule ^(.+) - [PT]
Виртуальные хосты пользователей
Если Вы хотите предоставлять адреса www.subdomain.domain.ru для страниц пользователей, Вы можете использовать следующий набор правил для преобразования http://www.subdomain.domain.ru/path во внутренний путь /home/subdomain/path:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.[^.]+\.ru$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^www\.([^.]+)\.ru(.*) /home/$1$2
Переадресация поддоменов с помощью .htaccess
Однажды сталкиваешься с проблемой - необходимо иметь неограниченное количество поддоменов, а они как раз кончились. Приходится заниматься изучением mod_rewrite, с помощью которого возможно сделать почти все что угодно.
Потратив достаточно долгое время на поиски готового скрипта, пришлось констатировать тот факт, что либо все это работает не совсем правильно, либо вообще не работает.
Теперь я знаю как это сделать и сейчас покажу на примерах. Для начала сделаем поддомены на свежем сайте, т.е. готовой структуры пока нет и можно делать все что угодно.
Создайте файл .htaccess в корне сайта и впишите в него следующий код:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\.domain\.(com|ru)$
RewriteCond %{HTTP_HOST} (www\.)?(.*)\.domain\.(com|ru)$
RewriteCond %{REQUEST_URI} !sub/
RewriteRule ^(.*)$ sub/%2/$1
Теперь подробно остановимся на каждом пункте.
Для запуска mod_rewrite используется команда RewriteEngine on, если ее закомментировать, то весь код перестанет работать, часто это бывает очень полезно.
RewriteBase указывает на использование текущей папки.
RewriteCond устанавливает правила, в зависимости от которых будет или не будет произведена замена адреса. В первом случае проверяется является ли поддомен с названием www, естественно его перенаправлять не нужно, поэтому перед строкой стоит восклицательный знак, обозначая отрицание. В скобках указано com|ru, используется только если вы имеете два одинаковых домена в разных зонах и они являются псевдонимами (алиасам) другу друга. Если вы используете один сайт, то запись будет такой:
RewriteCond %{HTTP_HOST} !^www\.domain\.com$
Во втором RewriteCond проверяется наличие в имени адреса поддомена, причем работать будет одинаково с www и без него, т.е. сайты www.forum.domain.com и forum.domain.com будут обрабатываться одинаково.
Третье условие используется для проверки уже исправленного адреса, т.к. mod_rewrite выполняется пока условия перестанут подходить. Итак мы проверяем в строке запроса (URI, то что идет после имени домена, например /info.html) наличие папки куда мы перенаправили запрос, в данном случае это sub, перед ним стоит восклицательный знак, который сообщает, что условие не должно выполняться при наличии такой подстроки.
И наконец само правило преобразования адреса RewriteRule. В нем мы заменяем строку запроса на новый адрес:
sub + второй найденный элемент (условие RewriteCond %{HTTP_HOST} (www\.)?(.*)\.domain\.(com|ru)$, то что находится во вторых скобках) + адрес, который был изначально ( описанный в том же RewriteRule: ^(.*)$)
Перед запуском этого скрипта вам необходимо создать в папке sub необходимые вам папки поддоменов.
Лучше воздержаться от использования в качестве метки и основной папки простое слово типа sub, т.к. оно может оказаться в адресе страницы, лучше использовать произвольный набор символов.
Бывают ситуации, когда необходимо использовать два разных адреса для одной и той же папки, например:
domain.com/forum/
и
forum.domain.com
В данном случае у нас на сервере уже есть папка forum, и полностью копировать ее еще и в папку sub не очень удобно и не совсем правильно. Найденный вариант использования mod_rewrite не совсем универсальный, но все позволяет обслужить конечное число поддоменов:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^forum\.domain\.(com|ru)$
RewriteCond %{REQUEST_URI} !/forum/
RewriteRule ^(.*)$ /forum/$1 [L]
Сначала проверяем нужный нам поддомен forum.domain.com (или forum.domain.ru). Потом ищем строку /forum/ в самом запросе, проверяя не изменили ли мы уже этот адрес. И наконец делаем преобразование. Знак [L] обозначает окончание преобразования, если это правило выполнилось, то дальнейшая обработка прекращается.
Таких правил может быть сколько угодно, главное не забывайте о наличии нужных папок на сервере.
В некоторых случаях в панели хостинга нужно прописать алиас для вашего домена. Обычно там описаны два варианта:
domain.com
и
www.domain.com
Вам нужно добавить строку:
*.domain.com
Теперь, когда все настроено и работает, возникает проблема со ссылками Sape. Они не будут нормально отображаться, потому что фактически адрес ссылки изменился, был http://forum.domain.com, а стал, например, http://domain.com/sub/forum/, поэтому в коде Sape нужно прописать новый хост и путь к папке с базой. Выглядит это примерно так:
if (!defined('_SAPE_USER'))define('_SAPE_USER', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx');
require_once($_SERVER['DOCUMENT_ROOT'].'/sub/forum/'._SAPE_USER.'/sape.php');
$o['host']='forum.domain.com';
$sape = new SAPE_client($o);
echo $sape->return_links();
Обратите внимание на путь к файлу sape.php в require_once и новое имя домена в $o['host']
Q.
Как разместить несколько сайтов на одном виртуальном хостинге?
A.
Чтобы разместить два или более сайтов на одном виртуальном хостинге, вопреки отведенному вам тарифным планом количеству доменов необходимо в файле ".htaccess" прописать следующие строки:
RewriteEngine On
RewriteRule ^newdirectory/ - [L]
RewriteCond %{HTTP_HOST} (www.)?newdomain.ru [NC]
RewriteRule (.*) newdirectory/$1 [L]
Где:
newdirectory/ - папка, в которой будет лежать второй сайт
newdomain.ru - домен, для которого мы делаем перенаправление
Обратите внимание, что при этом у Вас будет единый почтовый аккаунт. Т.е. если, у Вас существует ящик
[email protected], то после подключения домена newdomain.ru у ящика
[email protected] появляется второе имя -
[email protected]. А при создании любого нового ящика (например info), ему автоматически присваиваются два имени -
[email protected] и
[email protected].
Действующий пример:
Options +Includes +FollowSymLinks -Indexes
AddHandler server-parsed .shtml
DirectoryIndex index.shtml index.htm index.php index.html
AddDefaultCharset windows-1251
CookieTracking on
CookieExpires "1 years"
# default php version is 4.3.9
# uncomment next line to use latest 4.4.x
#AddType application/x-httpd-php44 php
# uncomment next line to use latest 5.x
#AddType application/x-httpd-php5 php
RewriteEngine On
# показываем директорию domen1
RewriteRule ^domen1/ - [last]
RewriteCond %{HTTP_HOST} (www.)?domen1.su [nocase]
RewriteRule (.*) domen1/$1 [last]
RewriteRule ^domen2/ - [last]
RewriteCond %{HTTP_HOST} (www.)?domen2.su [nocase]
RewriteRule (.*) domen2/$1 [last]
RewriteRule ^domen3/ - [last]
RewriteCond %{HTTP_HOST} (www.)?domen3.su [nocase]
RewriteRule (.*) domen3/$1 [last]
RewriteEngine On
RewriteBase /
# для показа без www. поддиректории dopdomen вместе с доменом domen4
RewriteCond %{HTTP_HOST} ^(www.)?dopdomen.domen4.su/$
RewriteCond %{REQUEST_URI} !^/dopdomen(/.*)?$
RewriteCond %{REQUEST_URI} !^/cgi-bin(/.*)?$
RewriteRule ^(.*) /dopdomen/$1 [L]
Q.
Как сделать 301 редирект в .htaccess со ссылки вида index.php?productID=4370 (id может быть разным) на главнцю страницу
A.
RewriteCond %{QUERY_STRING} ^productID=[0-9]+$
RewriteRule ^index.php$ http://%{HTTP_HOST}/? [R=301,L]
для страниц типа http://сайт/catolog-3455.....
RewriteRule catolog-[0-9]+ http://%{HTTP_HOST}/? [R=301,L]
для обоих редиректов, если необходимо, можно ограничить диапазон номеров, для которых будет сделан редирект
Q.
Hадо со страниц вида http://www.site.ru/catalog/538.php/ или .php/abrakadabra или .php? и т.д. обрезалось то что после .php
Причем страницы могут быть разного уровня вложенности
т.е. не только такие
http://www.site.ru/catalog/538.php
но и
http://www.site.ru/fabrika/porto/746.php
и т.д.
A.
RewriteEngine On
RewriteRule ^(.+\.php).+$ /404.php? [R=301,L]
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(.+\.php) /404.php? [R=301,L]
Q.
.как заблокировать доступ к сайту посетителям с опредленных доменов?
A.
1.
RewriteEngine On
RewriteCond %{HTTP_REFERER} badhost.com
RewriteRule .? - [F]
2.
добавляем такую строчку в пхп скрипт:
if(strpos($_SERVER['HTTP_REFERER'],'yandex.ru')>1){
echo 'Пшол вон.';
exit;
}
Q.
Как сделать так, чтобы при любой попытки зайти на www.site.ru, сразу перекидывала на site.ru, без www
A.
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]
Q.
Имеются ссылки вида:
site.ru/post.php?id=1
Необходимо привести их к следующему виду: site.ru/post/1/
При этом нужно учесть, чтобы при переходе по первой ссылке, производился переход на вторую.
Также чтобы при переходе по site.ru/post/
появлялось сообщение об ошибке.
A.
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^id=(\d+)
RewriteRule ^post\.php /post/%1/? [R=301,L]
RewriteRule ^post/(\d+)/$ post.ru?id=$1 [L]
Q.
В последнее время в поисковой выдаче google мой сайт показывается про протоколу https, хотя раньше выдача была по http. Скажите кто знает почему google вдруг резко изменил ссылки и как вернуть обратно http?
A.
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule (.*) http://mysite.com/$1 [L,R=301]
A.
Для редиректа всех страниц без .html на страницы с .html
Существует правило:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+)$ /$1.html [R=301,L]
Данный 301 редирект помог, всё хорошо, если бы ни одно НО..
Страница вида: site.ru/manager редиректится на site.ru/manager.html в том числе!
Как можно этого избежать?
Q..
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/manager/?$
RewriteRule ^([^.]+)$ /$1.html [R=301,L]
Q.
Настройка редиректов с русских букв
A.Чтобы убедиться в работоспособности RewriteRulей сделайте следующее:
1) в корень сайта файл .htaccess в кодировке "UTF-8 без BOM"
Код:
RewriteRule ^страница-(.*)/текст-(.*).html$ /test.php?page=$1&text=$2 [NC,L]
2) также в корень положить файл test.php в кодировке "UTF-8 без BOM"
Код:
header('Content-type: text/html; charset=utf-8');
echo "Страница - $_GET['page']";
echo "Текст - $_GET['text']";
3) В браузере вводим www.site.ru/страница-персональная/текст-ХеллоМир.html
4) Смотрим результат.
Q.Убрать дубли страниц в htaccess
Нужно реализовать редирект со страниц:
Код:
http://domain.tld/index.php?
http://domain.tld/index.php?любой параметр
http://domain.tld/?
http://domain.tld/?любой параметр
на
Код:
http://domain.tld/
A.
RewriteEngine On
RewriteCond %{THE_REQUEST} ?
RewriteRule ^(index.php)?$ /? [R=301,L]
Q.
Пробую сделать так чтобы для определенного IP был редирект только на одну определенную страницу.
A.RewriteCond %{REMOTE_ADDR} =1.1.1.1
RewriteRule !^url.html /url.html [R=301,L]
Q.
Есть страница на сайте:
http://siteA.com/index.php?page=shop...emart&Itemid=2
нужно сделать редирект 301 на
https://siteB.com/katalog A.Нужно добавить после RewriteEngine On
RewriteCond %{QUERY_STRING} =page=shop.browse&category_id=35&option=com_virtuemart&Itemid=2 RewriteRule ^index\.php /category/nabory-dlya-vyshivaniya-lentami/? [R=301,L]
Q.
Нужно удалить последний сегмент адреса. Если пользователь переходит по адресу site.com/directory1/directory2/article_id/something я хочу сделать 301-ый редирект на site.com/directory1/directory2/article_id/.
A.RewriteRule ^directory1/directory2/([^/]+)/.+ /directory1/directory2/$1/ [R=301,L]
Q.
На сайт приходят боты-накрутчики с именем хоста, вроде:
65-77-144-228.site.ru
65-77-144-127.site.ru
65-77-144-239.site.ru
IP у всех разные. Общее только *.site.ru
Как запретить доступ в .htaccess или robots.txt, по имени подобного хоста?
A.
RewriteEngine On
RewriteBase /
SetEnvIfNoCase Referer "^$" bot
SetEnvIfNoCase User-Agent "^.site.ru" bot
Deny from env=bot
Q.
Помогите htaccess написать, чтобы по запросу поддомена открывалась внутреняя основного сайта: sub_1.site.ru юзер видел содержимое site.ru/sub_1.html
A.
RewriteCond %{HTTP_HOST} ^(?www\.)?([^.]+)\.site\.ru$
RewriteRule ^$ %2.html [L]