Регулярные выражения в файле .htaccess используются в RewriteCond и RewriteRule, то есть для описания условий срабатывания правил и для описания самих правил. С помощью регулярных выражений задаются шаблоны строк. Синтаксис - такой же как в языке Perl.

Элементы

Метасимволы

Используются для задания групп символов или «меток» в шаблоне. Например, метки начала или конца строки.

\Экранирование. Считать следующий метасимвол обычным символом.
^Метка начала строки.
$Метка конца строки.
.(точка)Заменяет собой любой произвольный символ, но только один. Кроме символа конца строки.
|Логическое ИЛИ, варианты выборки.
()Группировка.
[]Класс символов. Например, [abc].
[^...]Инвертированный класс символов. Например, [^abc].

Группировка () также используется для обратной связи с шаблоном, вернее для части строки, которая попадёт под группировку.

Модификаторы

Ставятся после обычных символов, метасимволов или их групп. Расширяют возможности использования шаблонов.

?Символ повторяется 0 или 1 раз.
*Повторяется от 0 до 65536 раз.
+Повторяется от 1 до 65536 раз.
{n}Точно n раз.
{n,}От n до 65536 раз включительно.
{n,m}От n до m раз включительно.

Примеры шаблонов

^linux
Любые строки, начинающиеся со слова linux. Строка, начинающаяся со слова altlinux не удовлетворит критерию.

windows$
Любые строки, заканчивающиеся набором символов windows. Строка, заканчивающаяся на windows-suck под выбор не попадёт.

.*
Любой символ повторяется любое количество раз. Под критерий попадут все строки.

^(.*)$
Выбрать любую строку и сохранить её как переменную $1 для дальнейшего использования.

^(.+)/(.+)$
Разбить строку на две части: до слэша и после, части строки будут доступны по переменным $1 и $2.

Важно: так как модификатор жадный, то в первую группу попадёт максимальное количество символов, удовлетворяющих шаблону.
Слеш является таким же символом, как и все остальные.

Пример для ясности:
RewriteRule ^(.+)/(.+)$ /?a=$1&b=$2 [R=301,L]
http://www.it-simple.ru/1/2/3/4/5
http://www.it-simple.ru/?a=1/2/3/4&b=5

[0-9]{1,6}$
Выбрать все строки, оканчивающиеся от 1 до 6 цифами из диапазона от 0 до 9.

Примеры правил

В начало .htaccess обычно ставят:

RewriteEngine On
RewriteBase /

Первая строка включает обработку правил, вторая — обрезает полный путь (от корня сервера) до корня сайта.
/home/papka-s-saitom/public_html/razdel/podrazdel/ — таким был путь до RewriteBase /
/razdel/podrazdel/ — таким станет после

Благодаря «RewriteBase /» удобнее делать преобразования URI (убирается привязка к физическому расположению файлов сайта на сервере).


Ставим 301 редирект с www.имя.сайта на имя.сайта
(убираем "www").

RewriteCond %{HTTP_HOST} ^www.имя.сайта$
RewriteRule (.*) http://имя.сайта/$1 [R=301,L]

Делается для поисковых машин, чтобы не бить статистику.


При запросе файла .htaccess говорим, что он не существует (410, GONE).

RewriteRule ^/.htaccess$ - [G]

Запрещаем вход на сайт Интернет Експлореру (вернее, кто себя так определяет) и пользователям с определённого IP-адреса (xxx.xxx.xxx.xxx).

RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteCond %{REMOTE_ADDR} ^xxx\.xxx\.xxx\.xxx$
RewriteRule ^.*$ - [F]

Изменяем переменные php и передаём обработку другому скрипту.

RewriteCond %{QUERY_STRING} ^parameter=(.+)$
RewriteRule (.*) parameter.php\?%1 [L]

В этом примере запрос вида
index.php?parameter=some
преобразуется в
parameter.php?some


Убираем переменные php из запроса
(вырезаем из URI всё, что находится после знака вопроса)

RewriteRule (.*) $1? [R=301,L]


alex
2010.10.31 15:59:34
#cid537

Ответить

Где найти информацию о модификаторах на русском языка [G], [L] и др
RewriteRule ^htaccess-fake$ - [G]
RewriteRule (.*) parameter.php\?%1 [L]

2010.11.02 02:48:25
#cid547

Ответить

Где найти информацию о модификаторах на русском языка [G], [L] и др

В Яндексе, вестимо!

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

* R (redirect) останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на данную страницу (302, MOVED TEMPORARY). С данным флагом можно указать другой код результата, например "R=301" возвратит редирект с кодом 301 (MOVED PERMANENTLY).
* F (forbidden) возвращает ошибку 403 (FORBIDDEN).
* G (gone) возвращает ошибку 410 (GONE).
* P (proxy) - по этому флагу Apache выполняет подзапрос (sub-request) к указанной странице с использованием программного модуля mod_proxy, при этом пользователь ничего не узнает об этом подзапросе. Если модуль mod_proxy не входит в состав вашей сборки Apache, то применение данного флага вызовет ошибку.
* L (last) останавливает процесс преобразования, и текущая ссылка считается окончательной.
* N (next) запускает процесс преобразования с первого по порядку правила.
* C (chain) объединяет несколько правил в цепочку. Если первое правило цепочки «не срабатывает», то вся цепочка игнорируется.
* NS (nosubreq) разрешает «срабатывание» правила только для настоящих запросов, игнорируя подзапросы (подзапрос может быть вызван, например, включением файла при помощи директивы SSI).
* NC (nocase) отключает проверку регистра символов.
* QSA (qsappend) добавляет исходные параметры запроса (query string) к замене. Если замена не включает в себя новые параметры запроса, то исходные параметры запроса добавляются автоматически. Если же включает, то без флага QSA исходные параметры запроса будут утеряны.
* PT (passthrough) останавливает процесс преобразования и передает полученную новую ссылку дальше «по цепочке», чтобы над ней могли «поработать» директивы Alias, ScriptAlias, Redirect и им подобные (тогда как при флаге L новая ссылка считается окончательной и не подлежит дальнейшей обработке).
* S (skip) пропускает следующее правило, если данное правило «сработало». Можно пропускать несколько правил, если указать их количество, например: «S=3».
* E (env) устанавливает переменную окружения, например: «E=переменная:значение».

http://www.pcre.ru/docs/apache/text/urltrans/

Чуть позже добавлю в запись.

Денис
2011.03.15 17:13:28
#cid1814

Ответить

Как сделать редирек страницы самой на себя через thaccess, так чтобы параметры откинулись ?

2011.03.15 17:44:12
#cid1815

Ответить

Как сделать редирек страницы самой на себя через thaccess, так чтобы параметры откинулись ?

Например?

Денис
2011.03.15 17:54:09
#cid1816

Ответить

Options +FollowSymLinks
RewriteEngine on

RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^(.*)\.html$ $1\.html [R=301,NC]

Денис
2011.03.15 17:55:08
#cid1817

Ответить

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

2011.03.15 20:02:06
#cid1819

Ответить

Options +FollowSymLinks
RewriteEngine on

RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^(.*)\.html$ $1\.html [R=301,NC]

Что-то типа того:

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^(.*)\.php\?(.*)$ $1\.php [R=301,NC,L]

Насколько я помню, шаблон применяется ко всему URL, то есть включая QUERY_STRING, отброс которого и надо предусмотреть.

Денис
2011.03.16 10:28:37
#cid1823

Ответить

с такой конструкцией даже редирект не вызывается, т.е. получается без параметров в шаблоне урла.

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

2011.03.16 14:12:46
#cid1825

Ответить

с такой конструкцией даже редирект не вызывается

В смысле - работает? Или наоборот?

Смотри. Пусть RewriteBase отсутствует. Вызываем урл http://www.mysite.dom/index.php?lang=ru

RewriteCond %{QUERY_STRING} ^lang=ru$
Запрашиваемый урл попадает под это правило, других правил нет, поэтому будет выполнен RewriteRule строкой ниже.

RewriteRule ^(.*)\.php\?(.*)$ $1\.php [R=301,NC,L]
Исходный урл: http://www.mysite.dom/index.php?lang=ru
Шаблон разборки урла: ^(.*)\.php\?(.*)$
Урл будет разобран по переменным: $1 = http://www.mysite.dom/index, $2 = lang=ru и собран обратно уже в виде http://www.mysite.dom/index.php ($1\.php)
А далее будет 301 редирект на новый урл.

Если надо, чтобы клиент не видел, что его урл обрезается - убираем редирект, то есть флаг [R]

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

Если мешает QUERY_STRING, можно просто в начале .php его обнулить, без дополнительных файлов.
unset($_SERVER['QUERY_STRING']);
Или не обнулить, а сделать редирект на себя, но уже без QUERY_STRING.
header ("location: http://www.mysite.dom/index.php");

Денис
2011.03.17 16:09:06
#cid1827

Ответить

Да, по шаблону именно так и должно разобраться, но в итоге конструкция просто не работает и пропускается, т.е. никаких редиректов вобще нет. Отсюда, я думаю, что в шаблоне RewriteRule (первый параметр) просто не используется QUERY_STRING, а так как там стоит экранированный ?, то получаем ошибку и конструкция пропускается.

Сделал через файл, правда QUERY_STRING вручную обрезал от урла.
А разве unset($_SERVER['QUERY_STRING']) обнулит параметры в $_SERVER[REQUEST_URI] ?

2011.03.17 17:14:19
#cid1828

Ответить

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

Сейчас буду проверять в чём ошибка, позже отпишусь.

А разве unset($_SERVER['QUERY_STRING']) обнулит параметры в $_SERVER[REQUEST_URI] ?

Нет конечно.
unset($_SERVER['QUERY_STRING']) обнулит переменную $_SERVER['QUERY_STRING'] текущего запроса.

Я ж не знаю цели - чего нужно добиться - поэтому предлагаю варианты вслепую.

2011.03.17 18:11:30
#cid1829

Ответить

Окончательный и рабочий вариант.

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^lang=ru$ [NC]
RewriteRule (.*) $1? [R=301,L]

1. Флаг [NC] имеет смысл ставить только при непосредственном сравнении строк, т.е. в нашем RewriteCond.
2. Для того, чтобы убрать QUERY_STRING исходного запроса, надо в RewriteRule завершить подстановку символом «?»

Денис
2011.03.17 19:18:52
#cid1831

Ответить

"Для того, чтобы убрать QUERY_STRING исходного запроса, надо в RewriteRule завершить подстановку символом «?»"
тогда символ вопроса будет в новом урле вроде бы или нет?

2011.03.17 20:10:34
#cid1833

Ответить

тогда символ вопроса будет в новом урле вроде бы или нет?

Нет, не будет.
Я же говорю - полностью рабочий вариант.

Денис
2011.03.18 11:28:45
#cid1835

Ответить

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

Денис
2011.03.18 11:38:58
#cid1836

Ответить

RewriteBase / - а че значит это строка?

2011.03.18 14:26:38
#cid1837

Ответить

RewriteBase / - а че значит это строка?

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

http://www.mysite.dom/index.php

попадёт под правило

RewriteRule ^/index.php$ ...

2011.03.18 14:35:41
#cid1838

Ответить

Попробовал, работает! это вариант поинтереснее чем с файлом будет.

Дык - и работает на уровне веб сервера, а не PHP.
Что и правильнее, и быстрее, и лучше.

Благодарю, что помогли разобраться!

Всегда пожалуйста )

Вася!
2011.09.16 08:18:07
#cid5531

Ответить

Добрый день немогли бы вы помочь написать мне регулярку для того чтобы страницы типа www.site.ru/?fde_а ,www.site.ru/?fde_b ... в общем все урлы содержащие ?fde перенаправляли на 404 ошибку...заранее спасибо

2011.09.16 19:22:54
#cid5548

Ответить

Добрый день немогли бы вы помочь написать мне регулярку для того чтобы страницы типа www.site.ru/?fde_а ,www.site.ru/?fde_b ... в общем все урлы содержащие ?fde перенаправляли на 404 ошибку...заранее спасибо

RewriteCond %{QUERY_STRING} ^fde [NC]
RewriteRule (.*) page_404.php? [R=301,L]

Вася!
2011.09.19 20:44:02
#cid5688

Ответить

Спасибо!Очень выручили

Антон
2011.11.09 14:29:33
#cid7699

Ответить

Добрый день! Хорошая статья, достаточно понятно написано про регулярные выражения (насколько это возможно :) )
Такой вопрос:
Есть урл типа:
http://www.site.ru/index.php?option=com_idoblog&task=viewpost&id=154
если в урле встречается текст "idoblog" его нужно преобразовать к урлу типа:
http://www.site.ru/main.php?option=com_idoblog&task=viewpost&id=154
(т.е. просто заменить "index" на "main")

Я написал вот такие регулярки, но они не работают:
RewriteCond %{QUERY_STRING} ^idoblog$
RewriteRule ^(.*)index\.php\?(.*)$ $1main\.php\?$2 [NC,L]

Подскажите, что не так и в каком направление двигаться?
P.S. Хочу чтобы у пользователя в браузере урл не менялся, а просто подгружался нужный скрипт. Указал флаги правил [NC,L]. Верно ли?

2011.11.10 02:44:02
#cid7725

Ответить

Подскажите, что не так и в каком направление двигаться?

1. Ошибка в фильтре.

RewriteCond %{QUERY_STRING} ^idoblog$

Здесь вся переменная QUERY_STRING должна быть в точности равна idoblog, потому что стоят метки начала (^) и конца ($) строки. Только в этом случае правило сработает. Понятно, что это не то, что планировалось.

2. Флаг [NC] (NoCase) желательно поставить не только на правило, но и на фильтры.

3. Фильтров лучше поставить два. Первый проверяет вхождение idoblog в QUERY_STRING, второй — имя скрипта (index.php или main.php).

В итоге всё будет выглядеть примерно так:

RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} idoblog [NC]
RewriteCond %{PHP_SELF} ^/index.php$ [NC]
RewriteRule (.*) main.php [R=301,L]

Антон
2011.11.10 12:55:47
#cid7749

Ответить

Спасибо за оперативный ответ. Добавил сайт в закладки.

Newbee
2012.01.12 15:53:31
#cid12792

Ответить

Доброго времени суток, уважаемые. А скажите, пожалуйста, почему в среде Денвера в RewriteRule не работает следующая строка:
RewriteRule ^order.html:([0-9]+)? index.php?content=order&id=order&order=$1
при этом, если заменить двоеточие на дефис, например, все работает нормально.
С уважением, новичок.

2012.01.12 16:03:12
#cid12794

Ответить

#cid12792, Newbee

Доброго времени суток, уважаемые.

Здрасьте.

А скажите, пожалуйста, почему в среде Денвера в RewriteRule не работает следующая строка:
RewriteRule ^order.html:([0-9]+)? index.php?content=order&id=order&order=$1

Есть мнение, что дело в неспособности виндуса обрабатывать двоеточия в именах файлов.
В линухах всё работает как надо. Только что проверил.

Кстати, ? — или заэкранировать забыл, или со знаком $ перепутал. Но это так, к слову.

Антон
2012.01.24 16:12:00
#cid13869

Ответить

Добрый день!
Хочу настроить 301-редирект со страниц типа:
site.ru/razdel/index.php
на
site.ru/razdel/
или
site.ru/razdel/podrazdel/index.php
на
site.ru/razdel/podrazdel/
и т.д.

т.е. вместо индекса редиректить в корень текущей папки.
я написал следующее:
RewriteCond %{QUERY_STRING} /index.php$
RewriteRule ^(.*)index\.php$ $1 [R=301,L]
Но это не работает.

Прошу совета.

П.С. Не зря сайт в закладки добавил, частенько приходится возвращаться к нему :)

2012.01.24 20:56:27
#cid13885

Ответить

#cid13869, Антон

Добрый день!

Добрый.

RewriteCond %{QUERY_STRING} /index.php$

QUERY_STRING — это строка с набором переменных для PHP. Часть урла после знака вопроса (и до решётки якоря, если он есть).

Убери всю строку RewriteCond, она тут не нужна, а правило RewriteRule сделай последним (или убери ключ L).
И будет тебе счастье.

П.С. Не зря сайт в закладки добавил, частенько приходится возвращаться к нему :)

:)

Антон
2012.01.25 11:19:06
#cid13931

Ответить

Оставил только:
RewriteRule ^(.*)index\.php$ $1 [R=301]
Уже лучше - заработало, но не правильно.

Например при обращении к странице:
http://site.ru/razdel/podrazdel/index.php
редиректит на:
http://site.ru/home/papka-s-saitom/public_html/razdel/podrazdel/

Т.е. почему то выводит полный путь от корня сервера.

2012.01.25 15:37:48
#cid13943

Ответить

#cid13931, Антон

Т.е. почему то выводит полный путь от корня сервера.

В начало .htaccess обычно ставят:

RewriteEngine On
RewriteBase /

Первая строка включает обработку правил, вторая — обрезает полный путь (от корня сервера) до корня сайта.
Было:
/home/papka-s-saitom/public_html/razdel/podrazdel/
Станет:
/razdel/podrazdel/

Благодаря «RewriteBase /» удобнее делать преобразования URI.

Антон
2012.01.25 15:51:37
#cid13945

Ответить

Благодарю.
Совсем забыл про "RewriteBase /"

Сергей
2012.04.13 15:00:18
#cid21139

Ответить

Уважаемые знатоки!
Подскажите, пожалуйста, как сделать чтобы все урлы типа /page и /page/ редиректились на page.html но при этом исключить урл ajax/
Заранее спасибо за ответ

2012.04.13 15:25:42
#cid21143

Ответить

#cid21139, Сергей

Подскажите, пожалуйста, как сделать чтобы все урлы типа /page и /page/ редиректились на page.html но при этом исключить урл ajax/

Типа того:

RewriteCond %{REQUEST_URI} !^/ajax/?$
RewriteCond %{REQUEST_URI} ^/([^./\s]+)/?$
RewriteRule .* /%1.html [L,R=301]

Сергей
2012.04.24 16:33:10
#cid22570

Ответить

есть ссылки типа
/index.php?class=page&type=1&rubrik=1&countpp=15&pge=1
нужно преобразовать их в
/page/
с последующим редиректом на них, чтоб пользователь не видел длинные кривые ссылки.

RewriteRule ^([^/]*)/$ /index.php?class=$1&type=1&rubrik=1&countpp=1&pge=1 [R,L]
не помогает

Сергей
2012.04.24 16:43:32
#cid22572

Ответить

т.е. фактически мне нужно сделать обратное вот этому
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /index.php?class=$1&type=$2&rubrik=$3&countpp=$4&pge=$5 [R=301,L]

2012.04.24 19:01:38
#cid22596

Ответить

#cid22572, Сергей

т.е. фактически мне нужно сделать обратное вот этому
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /index.php?class=$1&type=$2&rubrik=$3&countpp=$4&pge=$5 [R=301,L]

Если тебе нужно, чтобы в результате этого преобразования не менялась ссылка в адресной строке — просто убери флаг R=301.

Обратное преобразование выглядит примерно так:

RewriteCond %{QUERY_STRING} ^class=page&type=(\d+)&rubrik=(\d+)&countpp=(\d+)&pge=(\d+)$
RewriteRule .* /page/%1/%2/%3/%4/ [L,R=301]

Но его цель — неясна. Скрипту проще обрабатывать переменные в нормальном виде, чем выдирать их из урла.

Иван
2012.05.17 19:06:12
#cid25428

Ответить

Ребят, помогите пожалуйста
Нужно сделать редирект с
http://доменное.имя/index.php?option=com_virtuemart&page=shop.browse&category_id=699&Itemid=28
на
http://доменное.имя/index.php?option=com_virtuemart&page=shop.browse&category_id=939&Itemid=28
Отличие только в значении category_id

Долго уже бьюсь, не получается
Правомерно ли делать так:
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^category_id=699&Itemid=28$ [NC]
RewriteRule (.*) /index.php?option=com_virtuemart&page=shop.browse&category_id=939&Itemid=28 [R=301,NC,L]
Может и составил бред, но это уже в конец запутался.

2012.05.17 20:40:35
#cid25439

Ответить

#cid25428, Иван

Ребят, помогите пожалуйста

Доменное имя светить не надо. После "RewriteBase /" для подавляющего большинства преобразований оно не имеет значения.

Убрал.

Долго уже бьюсь, не получается

Проверяем QUERY_STRING на наличие "category_id=699" (в любом регистре).
Дополнительно запоминаем предыдущие и последующие параметры в GET запросе:

RewriteCond %{QUERY_STRING} ^(.*)category_id=699(.*)$ [NC]

Если фильтр сработает — делаем 301-е перенаправление:

RewriteRule .* /index.php?%1category_id=939%2 [R=301,L]

Иван
2012.05.18 11:00:01
#cid25539

Ответить

Спасибо огромное безымянный #cid25439 - такого оперативного и квалифицированного ответа на форумах я еще не встречал. Поражаюсь тому количеству ситуаций, которые вы помогли разрешить, что хорошо видно по отзывам выше. Вы делаете полезное дело. Спасибо!

Иван
2012.05.18 11:11:46
#cid25540

Ответить

Кстати, если мне нужно сделать не одно а несколько точно таких же преобразований на сайте, то остальные уже не работают.
Например:
http://доменное.имя/index.php?option=com_virtuemart&page=shop.browse&category_id=700&Itemid=28
перенаправить на
http://доменное.имя/index.php?option=com_virtuemart&page=shop.browse&category_id=699&Itemid=28

Я сделал по образцу и подобию:
RewriteCond %{QUERY_STRING} ^(.*)category_id=700(.*)$ [NC]
RewriteRule .* /index.php?%1category_id=969%2 [R=301,L]

Возможно %1 и %2 воспринимаются как глобальные переменные, но если выставить %3 тоже ничего не выходит.
Вообще, не могли бы вы посоветовать наиболее адекватный для новичков справочник по настройке .htaccess (или регулярным выражениям, если так будет правильнее) кроме ваших статей.

Иван
2012.05.18 11:58:01
#cid25546

Ответить

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

2012.05.18 18:42:33
#cid25600

Ответить

#cid25539, Иван

Спасибо огромное безымянный #cid25439

Можно просто: злой админ.

Всегда пожалуйста!

2012.05.18 18:50:26
#cid25601

Ответить

#cid25540, Иван

Кстати, если мне нужно сделать не одно а несколько точно таких же преобразований на сайте, то остальные уже не работают.

Флаг L в правиле RewriteRule означает, что при его срабатывании все дальнейшие проверки не будут производиться.
Если проверки должны продолжаться — надо этот флаг убрать.

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

Возможно %1 и %2 воспринимаются как глобальные переменные

Нет, они работают только в пределах правила (в RewriteCond берём, в RewriteRule используем).

Вообще, не могли бы вы посоветовать наиболее адекватный для новичков справочник по настройке .htaccess (или регулярным выражениям, если так будет правильнее) кроме ваших статей.

В конце заметки — ссылки.
Кстати, сейчас добавлю ещё одну: на php.su. Там отлично всё разобрано.

Guest
2012.06.01 14:09:37
#cid27929

Ответить

Добрый день. Подскажите, пожалуйста, как правильно сделать редирект со старых адресов (они открываются, если руками ввести адрес), если у категории появилась родительская. Я составил вот такие правила, но они, к сожалению, не работают:

RewriteEngine On
RewriteBase /
RewriteRule (.*)/child/(.*)$ $1/parent/child/$2 [R=301]

2012.06.01 16:06:09
#cid27940

Ответить

#cid27929, Guest

RewriteRule (.*)/child/(.*)$ $1/parent/child/$2 [R=301]

Результат обработки тоже попадает под это правило. Поэтому оно зацикливается.
Надо аккуратнее, примерно так:

RewriteCond %{REQUEST_URI} ^/child/
RewriteRule ^(http://[^/]+)/(.*)$ $1/parent/$2 [R=301]

И даже в этом случае, если вдруг parent=child — всё будет не очень хорошо.
Поэтому имеет смысл добавить ещё один фильтр, против "зацикливания":

RewriteCond %{REQUEST_URI} ^/child/
RewriteCond %{REQUEST_URI} !^/child/child/
RewriteRule ^(http://[^/]+)/(.*)$ $1/parent/$2 [R=301]

Guest
2012.06.01 17:46:19
#cid27955

Ответить

#cid27940,

#cid27929, Guest

Результат обработки тоже попадает под это правило. Поэтому оно зацикливается.

Действительно. Спасибо за быстрый ответ, правда, так тоже не работает. Сайт на WP, поэтому встречается два вида адресов:

/category/child/
/child/pagename

Если я правильно понимаю, то правило:

RewriteCond %{REQUEST_URI} ^/child/

не подходит для адресов вида /category/child/
А выражение:

^(http://[^/]+)/(.*)$

означает, что в первой подмаске - название домена до слеша?

Попробовал изменить вот так:
RewriteCond %{REQUEST_URI} ^/[^/]+/child/.*
RewriteRule ^(http://mysite.ru/)([^/]+)/(.*)$ $1$2/parent/$3 [R=301]
Но тоже ошибочный вариант, не работает.

2012.06.01 19:37:24
#cid27979

Ответить

#cid27955, Guest

встречается два вида адресов:

Лично я бы сделал двумя разными преобразованиями:

/category/child/ → /category/parent/child/ [L,R=301]
/child/pagename → /parent/child/pagename [L,R=301]

со строгим контролем происходящего (pagename — цифры; category — слово; и т.д.)

Если я правильно понимаю

Так точно, по всем пунктам. За исключением одного моего важного косяка:
в URI, который обрабатывает RewriteRule, нету имени домена и начинается он не со слэша.
Был неправ.

Правила для адресов вида /category/child/:

RewriteCond %{REQUEST_URI} ^/[^/]+/child/
RewriteRule ^([^/]+)/(child/.*)$ $1/parent/$2 [R=301]

Guest
2012.06.03 00:01:28
#cid28230

Ответить

#cid27979,

#cid27955, Guest

Правила для адресов вида /category/child/:
RewriteCond %{REQUEST_URI} ^/[^/]+/child/
RewriteRule ^([^/]+)/(child/.*)$ $1/parent/$2 [R=301]

Должно работать. Но не работает. Наверное проблема в том, как сам вордпресс урлы формирует. Пойду поковыряю. Спасибо за советы, статья и ссылки на ресурсы очень полезные.

2012.06.04 19:16:41
#cid28440

Ответить

#cid28230, Guest

Должно работать. Но не работает.

Проверено на Linux + apache2. Делал запросы утилитой HEAD и смотрел логи.
Т.е. последний вариант скинул только после проверки, убедившись, что он рабочий.

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

Нет, это разное.
Вордпрессу важно одно единственное правило, которое все урлы перекидывает на файл index.php.
Правила из .htaccess не могут повлиять на вордпрессовский парсер путей.

Спасибо за советы, статья и ссылки на ресурсы очень полезные.

Пожалуйста.

Алексей
2012.06.12 11:04:00
#cid29629

Ответить

Здравствуйте! Я с программированием знаком оочень поверхностно, но возникла необходимость сделать перенаправление всех доменов третьего уровня в отдельную папку главного сайта. Попробовал несколько вариантов из сети, но ни чего не работает. Вот один из примеров:

RewriteCond %{HTTP_HOST} subdomain\.domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/subdomain/
RewriteRule ^(.*) %{HTTP_HOST}$1
RewriteRule ^(www\.)?(.+)\.domain\.com(.*) /$2%{REQUEST_URI}[L]

2012.06.13 20:53:42
#cid29884

Ответить

#cid29629, Алексей

Вот мои рабочие правила:

RewriteCond %{HTTP_HOST} ^sub\.domain\.ru$
RewriteRule (.*) /folder/index.php [L]

folder — каталог в корне основного сайта, в который перенаправляется поддомен sub домена domain.ru.

Важно: sub.domain.ru должен быть синонимом (alias) к домену domain.ru.

Олег
2012.06.20 00:15:45
#cid30685

Ответить

Доброго времени суток.

У меня есть меню:

$_s['serf_nav']=array(
array('index.html','Точка входа на сайт','Главная'),
array('about.html','Кратко о фирме','О нас'),
array('rss.html','RSS','RSS'),
array('/forum/index.php','Форум по шинам и дискам','Форум'),
array('connect.html rel="nofollow"','Email','Email'), # применение атрибута nofollow возможно.
array('sklad.html','Телефоны и схема проезда','Контакты'),
);

Когда находишься на главной странице, "Форум" уже выделен, как будто по нему кликнули.

Я понимаю, что ключ к решению проблемы в файле .htaccess

Вот его содержимое:

RewriteEngine on
RewriteBase /
RewriteRule ^.htaccess$ - [F]

RewriteRule ^(.*).shtml$ index.php?show=all
RewriteRule ^(.*).html$ index.php
RewriteRule ^(.*)/$ index.php

Помогите, пожалуйста, решить эту проблему.

2012.06.20 21:47:54
#cid30770

Ответить

Я понимаю, что ключ к решению проблемы в файле .htaccess

Нет. Проблема не в .htaccess, а в реализации меню на PHP.
Надо смотреть код.

Andrey
2012.06.22 10:18:30
#cid30976

Ответить

Помогите оптимизировать,

исходная ссылка вида: articles.php?action=view&id=2&author=3

задача чтобы осталось только значение переменной author.

Сделал так:

RewriteRule ^([0-9]*)-([\S]*)$ articles.php?action=view&id=$1&author=$2

выводит ссылку вида: http://site.ru/2-author-name

как убрать цифру из строки??

2012.06.22 17:53:44
#cid31010

Ответить

#cid30976, Andrey

Помогите оптимизировать,

Как один из вариантов:

RewriteCond %{REQUEST_FILENAME} ^articles\.php$ [NC]
RewriteCond %{QUERY_STRING} ^action=view&id=(\d+)&author=(\d+)$ [NC]
RewriteRule .* articles.php?author=%2

Andrey
2012.06.23 16:18:50
#cid31125

Ответить

#cid31010,

#cid30976, Andrey

Как один из вариантов:
RewriteCond %{REQUEST_FILENAME} ^articles\.php$ [NC]
RewriteCond %{QUERY_STRING} ^action=view&id=(\d+)&author=(\d+)$ [NC]
RewriteRule .* articles.php?author=%2

Не работает ((
The requested URL was not found on this server.

Andrey
2012.06.23 16:28:12
#cid31126

Ответить

#cid31010,

#cid30976, Andrey

Как один из вариантов:
RewriteCond %{REQUEST_FILENAME} ^articles\.php$ [NC]
RewriteCond %{QUERY_STRING} ^action=view&id=(\d+)&author=(\d+)$ [NC]
RewriteRule .* articles.php?author=%2

Точнее работает, показывает пустую страницу (шаблон), материал не выводит.
Видимо SQL пилить надо

2012.06.23 21:57:39
#cid31145

Ответить

Не работает ((
Точнее работает

Ты определись уже )

Поставь в конце правила 301 редирект [R=301]. Если адрес в адресной строке будет меняться на нужный (т.е. при попытке зайти на articles.php?action=view&id=2&author=3 будешь попадать на articles.php?author=3) — значит, правило работает. И надо смотреть, что articles.php делает с переданными параметрами.

Andrey
2012.06.24 22:19:46
#cid31206

Ответить

#cid31145,

Ты определись уже )

Поставь в конце правила 301 редирект [R=301]. Если адрес в адресной строке будет меняться на нужный (т.е. при попытке зайти на articles.php?action=view&id=2&author=3 будешь попадать на articles.php?author=3) — значит, правило работает. И надо смотреть, что articles.php делает с переданными параметрами.

добавил редирект, жму на ссылку articles.php?action=view&id=2&author=3 открывается страница и в адресной строке без изменений вижу articles.php?action=view&id=2&author=3

вот такая вот печаль...

Дмитрий
2012.06.26 09:50:47
#cid31406

Ответить

Добрый день подскажите как через htaccess сделать редирект на 404 ошибку если в адресе сайта присутствует больше двух слэшей (//) подряд

2012.06.26 16:32:57
#cid31452

Ответить

#cid31406, Дмитрий

Добрый день подскажите как через htaccess сделать редирект на 404 ошибку если в адресе сайта присутствует больше двух слэшей (//) подряд

RewriteCond %{REQUEST_URI} //
RewriteRule .* 404.html [R=301]

Но будет работать только для задвоений внутри адреса, например www.site.dom/dir//file.php
Если задвоение идёт сразу после имени домена (www.site.dom//dir/file.php) — оно не определяется, несмотря на то, что переходит в серверную переменную REQUEST_URI (//dir/file.php).

Если сможешь побороть — напиши как. Я способа пока не нашёл.
Единственное, что приходит на ум — сделать проверку и редирект средствами PHP, но это не очень правильно.

2012.06.26 16:52:11
#cid31454

Ответить

#cid31206, Andrey

добавил редирект, жму на ссылку articles.php?action=view&id=2&author=3 открывается страница и в адресной строке без изменений вижу articles.php?action=view&id=2&author=3

вот такая вот печаль...

Мля.

Не REQUEST_FILENAME, а REQUEST_URI, конечно же.
REQUEST_FILENAME даёт путь к скрипту от корня файловой системы.

Вот рабочие правила:

RewriteCond %{REQUEST_URI} ^/articles\.php$ [NC]
RewriteCond %{QUERY_STRING} ^action=view&id=(\d+)&author=(\d+)$ [NC]
RewriteRule .* articles.php?author=%2

Andrey
2012.06.26 17:16:02
#cid31456

Ответить

#cid31454,

#cid31206, Andrey

Мля.

Не REQUEST_FILENAME, а REQUEST_URI, конечно же.
REQUEST_FILENAME даёт путь к скрипту от корня файловой системы.

Вот рабочие правила:
RewriteCond %{REQUEST_URI} ^/articles\.php$ [NC]
RewriteCond %{QUERY_STRING} ^action=view&id=(\d+)&author=(\d+)$ [NC]
RewriteRule .* articles.php?author=%2

на самом деле не понятно,
если есть 2 статьи одного автора, как сервер поймет какую статью выдать, если убрать id статьи?

Andrey
2012.06.26 17:27:05
#cid31461

Ответить

сделал сортировку по столбцам таблицы, функционально все работает на ура, но с точки зрения SEO получается полный кавардак.

на странице есть разбиение результатов, по 10 строк на страницу.

вот, например, ссылка второй страницы(page=2) с сортировкой по названию(key=title), по убыванию(sort=desc)

proizvoditeli?key=title&sort=desc&page=2

т.е. одна и также страница может иметь вид:

proizvoditeli?key=title&sort=desc&page=2
proizvoditeli?key=title&sort=asc&page=2
proizvoditeli?key=tovar&sort=desc&page=2
proizvoditeli?key=tovar&sort=asc&page=2
proizvoditeli?key=strana&sort=desc&page=2
proizvoditeli?key=strana&sort=asc&page=2
proizvoditeli?key=title&sort=desc&page=2
proizvoditeli?page=2

пробовал делать 301 редирект на proizvoditeli-page-2

тогда отваливается полностью сортировка

реально сделать из этого зверинца работающую страницу типа proizvoditeli-page-2 ?

2012.06.26 17:47:24
#cid31463

Ответить

#cid31456, Andrey

на самом деле не понятно,
если есть 2 статьи одного автора, как сервер поймет какую статью выдать, если убрать id статьи?

Интересный вопрос.
Стояла задача о конкретном преобразовании, она решена.
Теперь ты задумался, нужно ли было это делать?

Andrey
2012.06.26 17:56:08
#cid31465

Ответить

#cid31463,

#cid31456, Andrey

Интересный вопрос.
Стояла задача о конкретном преобразовании, она решена.
Теперь ты задумался, нужно ли было это делать?

решаю проблемы по мере их поступления)))

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

2012.06.26 18:05:57
#cid31469

Ответить

#cid31461, Andrey

Правила в htaccess — это всего лишь способ для предварительной обработки запроса. В конечном счёте мы всё равно попадаем в скрипт на PHP, который и делает всю работу по формированию страницы для выдачи.

Перед редактированием htaccess надо абсолютно точно понимать, что делают скрипты и какие параметры им нужны.

пробовал делать 301 редирект на proizvoditeli-page-2

тогда отваливается полностью сортировка

Какой скрипт будет обрабатывать этот запрос? Умеет ли он парсировать путь типа proizvoditeli-page-2? Каким образом передаётся тип и направление сортировки?

реально сделать из этого зверинца работающую страницу типа proizvoditeli-page-2 ?

Всё реально, если понимать, ЧТО ты хочешь сделать и КАК это будет работать.

2012.06.26 18:08:31
#cid31470

Ответить

#cid31465, Andrey

решаю проблемы по мере их поступления)))

Неправильный подход.

Потрать чуть больше времени на проектирование — и сэкономишь массу времени при разработке.

Andrey
2012.06.26 18:37:44
#cid31473

Ответить

весь скрипт наверно тут размещать не стоит, приличная простынка.

суть пагинации и сортировки - sql запрос:

SELECT title, alias, logo, tovar, strana FROM proizvoditeli ORDER BY $key $sort LIMIT $start, $num

вот в конце выборки есть переменные:

$key - что сортировать
$sort - как сортировать
$start - вычисляем начиная к какого номера следует выводить сообщения
$num - число сообщений выводимых на станице

все это обрабатывает php

интуитивно мне кажется, что без Явы одним RewriteRule здесь не выкрутиться никак, если ошибаюсь поправьте.

Andrey
2012.06.26 18:47:46
#cid31475

Ответить

#cid31470,

#cid31465, Andrey

Неправильный подход.

Потрать чуть больше времени на проектирование — и сэкономишь массу времени при разработке.

слабо представляю как такие мелочи можно проектировать

2012.06.26 19:36:14
#cid31486

Ответить

#cid31473, Andrey

интуитивно мне кажется, что без Явы одним RewriteRule здесь не выкрутиться никак, если ошибаюсь поправьте.

Ява вообще не нужна.
Какого вида будут ссылки?

Andrey
2012.06.26 19:55:37
#cid31492

Ответить

#cid31486,

#cid31473, Andrey

Ява вообще не нужна.
Какого вида будут ссылки?

дык вот, я ж писал:

proizvoditeli?key=title&sort=desc&page=2
proizvoditeli?key=title&sort=asc&page=2
proizvoditeli?key=tovar&sort=desc&page=2
proizvoditeli?key=tovar&sort=asc&page=2
proizvoditeli?key=strana&sort=desc&page=2
proizvoditeli?key=strana&sort=asc&page=2
proizvoditeli?page=2

это по сути одна страница в разных вариациях

Andrey
2012.06.26 20:09:26
#cid31500

Ответить

#cid31486,

#cid31473, Andrey

Ява вообще не нужна.
Какого вида будут ссылки?

я вот тут капаюсь, ищу нечто подобное, ссылку выкладывать не буду, но на джумле нашел сайт там почти грамотно реализовано.
идет вывод списком категории, правда все в form обернуто и java рулит сортировкой, только не понятно как сортировка запоминается у них при пролистывании страниц (может сессии, но это уже перебор).

ссылка на джумле имеет такой вид в коде:
href="javascript:tableOrdering('a.title','desc','');"

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

2012.06.26 20:26:34
#cid31502

Ответить

#cid31492, Andrey

дык вот, я ж писал:

proizvoditeli?key=title&sort=desc&page=2
proizvoditeli?key=title&sort=asc&page=2

Так в чём тогда проблема? Зачем трогать htaccess?
Аккуратно берёшь переменные из HTTP-запроса, проверяешь их и вставляешь в SQL-запрос.

#cid31500, Andrey

на джумле нашел сайт там почти грамотно реализовано.

Джумла большая, сложная и тормознутая.
Простые вещи лучше писать самому.

Andrey
2012.06.26 20:33:01
#cid31503

Ответить

#cid31502,

#cid31492, Andrey

Так в чём тогда проблема? Зачем трогать htaccess?
Аккуратно берёшь переменные из HTTP-запроса, проверяешь их и вставляешь в SQL-запрос.

#cid31500, Andrey

Джумла большая, сложная и тормознутая.
Простые вещи лучше писать самому.

ой а расшифруйте, пожалуйста, это магическое слово "аккуратно"
а то я ничегошеньки не понял.....

Артем
2012.06.28 13:25:29
#cid32030

Ответить

Добрый день! Помогите с редиректом, старые ссылки со знаком вопроса
старая ссылка на сайте http://sait.ru/prog/?tid=42&sid=43&isc=0
новая ссылка на сайте http://sait.ru/prog/super-title/

в хтакцессе прописываю следущее

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} ^/prog/?tid=42&sid=43&isc=0$
RewriteRule ^/prog/super-title? [R=301,L]

Скорее всего напортачил в синтаксисе, но не пойму где, напишите кто-нибудь для примера как правильно писать именно для моего сайта
Заранее спасибо!

Артем
2012.06.28 13:28:02
#cid32032

Ответить

Да, ЦМС ,если это имеет значение, у меня Joomla

Dazzer
2012.06.28 13:56:23
#cid32040

Ответить

Сколько уже мануалов перечитал но так и не вкурил как в htaccesse можно организовать через mod_rewrite замену во всех урлах знака вопроса (?) на знак тире (-) ?
Обьясняю на примере:
есть ссылка вида index.php?do=something
необходимо чтобы при вызове данного типа адреса (где есть знак вопроса после php) сервер выдавал страничку index.php-do=something (то есть вместо вопроса тире), но в адресной строке сохранялся прежний вид адреса (с вопросом).
Со стороны можно подумать что нафиг оно мне вообще надо, сам знаю бред, но к сожалению это единственный выход для меня. Прошу помочь!

2012.06.28 15:02:55
#cid32051

Ответить

#cid31503, Andrey

ой а расшифруйте, пожалуйста, это магическое слово "аккуратно"

Проверять типы переменных и экранировать спецсимволы, чтобы не поломать SQL-запрос, в который эти переменные вставляются.
"Аккуратно" — в смысле безопасности.

2012.06.28 15:12:08
#cid32058

Ответить

#cid32030, Артем

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} ^/prog/?tid=42&sid=43&isc=0$
RewriteRule ^/prog/super-title? [R=301,L]

Скорее всего напортачил в синтаксисе

Да.

Во-первых, QUERY_STRING — это часть после знака вопроса, т.е. в данном случае "tid=42&sid=43&isc=0"
Во-вторых, отсутствует первый параметр RewriteRule — шаблон, замена которого осуществляется.
В-третьих, второй параметр RewriteRule — не шаблон, не надо ставить метку начала строки.
В-четвёртых, желательно прописать "RewriteBase /"

Должно выглядеть примерно так:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^tid=42&sid=43&isc=0$
RewriteRule .* /prog/super-title? [R=301,L]

2012.06.28 15:19:31
#cid32062

Ответить

#cid32040, Dazzer

Сколько уже мануалов перечитал но так и не вкурил как в htaccesse можно организовать через mod_rewrite замену во всех урлах знака вопроса (?) на знак тире (-) ?

Сходу:

RewriteRule (.*) $1-%{QUERY_STRING}? [R=301]

Dazzer
2012.06.28 17:29:56
#cid32091

Ответить

#cid32062,

#cid32040, Dazzer

Сходу:
RewriteRule (.*) $1-%{QUERY_STRING}? [R=301]

Неа, при таком раскладе сайт вообще перестал работать, а при запросе любой странички сайта - редиректит на ужасно-длинную страничку типа
http://site.ru/var/www/user/data/www/site.ru/var/www/user/data/www/site.ru/var/www/user/data/www/site.ru/и.т.д...

2012.06.28 18:06:30
#cid32099

Ответить

#cid32091, Dazzer

Неа

Про "RewriteBase /" и условие срабатывания RewriteCond не забываем!
Если вопросы необходимо убирать в абсолютно всех урлах, надо делать так:

RewriteBase /
RewriteCond %{QUERY_STRING} !^$
RewriteRule (.*) $1-%{QUERY_STRING}? [R=301]

Тестировал, всё работает.

Dazzer
2012.06.28 18:25:48
#cid32108

Ответить

#cid32099,

ооо, точно, огромный спасиб) вот только какой там флаг надо выставить, чтобы адрес в адресной строке отображался со знаком вопроса?
т.е. запрос идет к index.php?do=something , отдается страница index.php-do=something , но в адресной строке показывается index.php?do=something

2012.06.28 18:33:25
#cid32110

Ответить

#cid32108, Dazzer

ооо, точно, огромный спасиб)

Пожалуйста )

вот только какой там флаг надо выставить, чтобы адрес в адресной строке отображался со знаком вопроса?

Надо не выставить, а наоборот, убрать флаг [R=301] в RewriteRule.

Dazzer
2012.06.28 18:40:05
#cid32111

Ответить

#cid32110,

респект тебе о великий спаситель))) спасибо

Lucinda
2012.08.04 01:43:45
#cid36224

Ответить

Подскажите, пожалуйста, нужно ли экранировать в htaccess символы ; и :

Дмитрий
2012.08.20 23:06:26
#cid38220

Ответить

Подскажите кто-нибудь, у кого руки из нужного места растут!
Есть джумловские страницы вида: http://site.ru/index.php?option=com_virtuemart&page=shop.browse&category_id=14&Itemid=2
как сделать 301 редирект на страницу http://site.ru/katalog/tabureti.html

Чего только не пробовал, не получается.

2012.08.21 05:08:47
#cid38252

Ответить

#cid38220, Дмитрий

Есть джумловские страницы вида: http://site.ru/index.php?option=com_virtuemart&page=shop.browse&category_id=14&Itemid=2
как сделать 301 редирект на страницу http://site.ru/katalog/tabureti.html

RewriteBase /
RewriteCond %{REQUEST_URI} ^/index\.php$ [NC]
RewriteCond %{QUERY_STRING} ^option=com_virtuemart&page=shop\.browse&category_id=14&Itemid=2$ [NC]
RewriteRule .* katalog/tabureti.html? [R=301]

2012.08.21 05:21:54
#cid38255

Ответить

#cid36224, Lucinda

Подскажите, пожалуйста, нужно ли экранировать в htaccess символы ; и :

Вроде как нет.

Экраны нужны только в тех местах, где они работают, т.е в шаблонах.
Если возникают сомнения — можно и заэкранировать, это не помешает: любой символ после экрана (без разницы управляющий он или нет) будет интерпретирован как просто символ.

Дмитрий
2012.08.21 07:05:47
#cid38261

Ответить

#cid38252,

#cid38220, Дмитрий

RewriteBase /
RewriteCond %{REQUEST_URI} ^/index\.php$ [NC]
RewriteCond %{QUERY_STRING} ^option=com_virtuemart&page=shop\.browse&category_id=14&Itemid=2$ [NC]
RewriteRule .* katalog/tabureti.html? [R=301]

Так не работает, ничего не происходит, перенаправления нет.

Александр
2012.09.09 17:41:04
#cid40588

Ответить

Здравствуйте подскажите пожалуйста. Как сделать 301 редирект со страницы http://okulovkastroy.ru/galeryeya/1-pilomaterialy/detail/6-profilirovannyi-brus-foto-6?tmpl=component на страницу http://okulovkastroy.ru/stroitelstvo-iz-profilirovannogo-brusa Бьюсь уже целый день ничего не выходит. Заранее спасибо за ответ.

Федор
2012.09.11 07:33:21
#cid40797

Ответить

Здравствуйте.
Помогите пожалуйста разобраться.
Если к урл добавляем произвольные символы, например http://сайт.ru/shop/svetilniki_dlya_spalni99999999999, любые символы доставить в конце этого урл, открывается главная страница категории http://сайт.ru/shop/, подскажите пожалуйста, как сделать чтоб отдавалась 404 страница. Заранее спасибо

Сергей
2012.09.11 09:54:49
#cid40810

Ответить

Ребят, помогите пожалуйста разобраться:
В корне сайта лежат два файла index.php и results.php Пытаюсь сделать чтобы при входе через site.ru/results/121 пользователь перенаправлялся на site.ru/results.php?id=121. Помогите реализовать

RewriteEngine on
RewriteRule ^results/([-a-zA-Z0-9_]+)/? results.php?id=$1 [L]
RewriteRule ^results/([-a-zA-Z0-9_]+)? results.php?id=$1 [L]

2012.09.11 21:07:13
#cid40894

Ответить

#cid40797, Федор

Если к урл добавляем произвольные символы, например http://сайт.ru/shop/svetilniki_dlya_spalni99999999999, любые символы доставить в конце этого урл, открывается главная страница категории http://сайт.ru/shop/, подскажите пожалуйста, как сделать чтоб отдавалась 404 страница. Заранее спасибо

Ссылки вида "http://сайт.ru/shop/svetilniki_dlya_spalni" генерируют многие популярные веб-движки. По своей сути они являются ссылками на несуществующие каталоги. Такие запросы перенаправляются на точку входа, движок их парсирует и по итогам решает, какую страницу надо выдать.

Важно понимать, что парсирование пути к несуществующему каталогу происходит внутри php-скрипта.

Решать эту проблему редактированием .htaccess — неправильно.

2012.09.11 21:12:18
#cid40895

Ответить

#cid40810, Сергей

Ребят, помогите пожалуйста разобраться:
В корне сайта лежат два файла index.php и results.php Пытаюсь сделать чтобы при входе через site.ru/results/121 пользователь перенаправлялся на site.ru/results.php?id=121. Помогите реализовать

Не пытайся махать шашкой и сделать всё в один проход. Используй RewriteCond, сформируй правильную цепочку фильтров.

Golos
2012.09.20 04:24:35
#cid41753

Ответить

Здравствуйте!

помогите пожалуйста!

Нашел дубли страниц. Один материал по двум адресам:

http://домен.ru/?file=seboreya
http://домен.ru/index.php?file=seboreya

Попробовал
RewriteEngine On
RewriteCond %{QUERY_STRING} ^/?file=seboreya$ [NC]
RewriteRule (.*) index.php?file=seboreya [R=301,L]

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

Как же зацикливание снять? Видимо конечный L запрос под фильтр попадает..(

Спасибо

2012.09.20 21:55:24
#cid41826

Ответить

#cid41753, Golos

Нашел дубли страниц. Один материал по двум адресам:

http://домен.ru/?file=seboreya
http://домен.ru/index.php?file=seboreya

Это один и тот же адрес. index.php — стандартная точка входа на сайт. Обычно не отображается.

RewriteEngine On
RewriteCond %{QUERY_STRING} ^/?file=seboreya$ [NC]
RewriteRule (.*) index.php?file=seboreya [R=301,L]

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

Добавь RewriteCond %{REQUEST_URI} ^/$

Видимо конечный L запрос под фильтр попадает..(

Флаг L означает, что для данного запроса это правило будет последним.
Всё хорошо, но флаг R=301 генерирует новый (!) запрос.

Golos
2012.09.21 02:03:17
#cid41849

Ответить

RewriteEngine On
RewriteCond %{QUERY_STRING} ^/?file=seboreya$ [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) index.php?file=seboreya [R=301,L]

Вот так получилось!

Спасибо!!!

Golos
2012.09.21 02:08:20
#cid41850

Ответить

а шаблон как лучше написать? что бы после (=) любое слово редиректилось по этой схеме.

Спасибо!

2012.09.21 04:07:52
#cid41856

Ответить

#cid41850, Golos

а шаблон как лучше написать? что бы после (=) любое слово редиректилось по этой схеме.

А нафига шаблон?

RewriteCond %{REQUEST_URI} ^/$
RewriteRule .* index.php [R=301,L]

Спасибо!

Пожалуйста )

Golos
2012.09.21 11:56:03
#cid41890

Ответить

Шаблон для того, что страничек 60 и пришлось к каждой странички писать отдельный редирект.

RewriteEngine On
RewriteCond %{QUERY_STRING} ^/?file=page2$ [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) index.php?file=page2 [R=301,L]

RewriteEngine On
RewriteCond %{QUERY_STRING} ^/?file=page3$ [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) index.php?file=page3 [R=301,L]

и т.д

а шаблон имел ввиду:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^/?file=любое название$ [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) index.php?file=то название файла что стоит в %{QUERY_STRING} [R=301,L]

)) но получается, не реализуемо

как вырезать из адреса например index.php понятно, а как преобразовать...в строку вида ?file=page1 в index.php?file=page1, уже нет.

Golos
2012.09.21 12:01:08
#cid41891

Ответить

А это преобразует Спасибо!

RewriteCond %{REQUEST_URI} ^/$
RewriteRule .* index.php [R=301,L]

2012.09.21 13:04:57
#cid41899

Ответить

#cid41890, Golos

)) но получается, не реализуемо

Изменения в URL-е — сугубо косметические. Переменные из QUERY_STRING будет обрабатывать тот же скрипт — index.php. Проверка QUERY_STRING не нужна абсолютно, поэтому я её и выкинул.

Как же оно нереализуемо, когда оно уже реализовано?!

Cepreu
2012.09.27 12:22:26
#cid42459

Ответить

Подскажите, пожалуйста!, по теме:

почему В СТРОКЕ НАБОРА АДРЕСА В БРАУЗЕРЕ меняет user.cite.ru на site.ru/to/user/news/ , хотя должно в строке оставаться user.cite.ru, а site.ru/to/user/news/ - это через modrewrite для скрипта сайта должно быть только видно?

кусок кода:

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !www\.site\.ru [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.cite/? [NC]
RewriteRule (.*) http://cite.ru/to/$2/news/$1

RewriteRule ^to/([^/]*)/news(/?)+$ index.php?action=news&user=$1 [L]

И , кстати , юзера пока тоже не определяет :) выводит: site.ru/to//news/ - это тоже пока проблемка, но не главная. Вылазит этот "явный" для посетителя редирект?

Спасибо!

Cepreu
2012.09.27 12:25:22
#cid42460

Ответить

к предыдущему: cite и site - опечатки, это условное название сайта, т.е. везде должно стоять site.ru

2012.09.27 19:35:20
#cid42506

Ответить

#cid42459, Cepreu

почему В СТРОКЕ НАБОРА АДРЕСА В БРАУЗЕРЕ меняет user.cite.ru на site.ru/to/user/news/ , хотя должно в строке оставаться user.cite.ru, а site.ru/to/user/news/ - это через modrewrite для скрипта сайта должно быть только видно?

Предполагаю, корни в том, что user.site.ru, www.site.ru и site.ru — это, с точки зрения веб-сервера, три абсолютно разных домена.
И. возможно, в том, что после "RewriteBase /" в "RewriteRule" задан полный путь для редиректа.

И , кстати , юзера пока тоже не определяет :) выводит: site.ru/to//news/ - это тоже пока проблемка

Группировка в RewriteCond доступна по %1, а в RewriteRule — по $1. То есть, надо делать так:

RewriteRule (.*) http://cite.ru/to/%1/news/$1

И кстати, зачем два преобразования цепочкой, когда можно обойтись одним?!
Попробуй это:

RewriteBase /
RewriteCond %{HTTP_HOST} !www\.site\.ru [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.cite/? [NC]
RewriteRule (.*) index.php?action=news&user=%1 [L]

Cepreu
2012.09.28 15:49:49
#cid42594

Ответить

#cid42506,

И кстати, зачем два преобразования цепочкой, когда можно обойтись одним?!

Там уже для скрипта стоит модрерайт движка с полусотней строк :), поэтому я хотел привести всё к движковому "языку", а там пусть бы он всё сам обрабатывал так как ему надо, чтобы самому не переписывать все варианты. Решил проблему с явным редиректом установив флаг [P], хрен его знает, что там дальше закрутилось, но исходя из описания флага (internal proxy) мне, вроде подходило. сделал - скрипт заработал. но!

Попробуй это:

RewriteBase /
RewriteCond %{HTTP_HOST} !www\.site\.ru [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.cite/? [NC]
RewriteRule (.*) index.php?action=news&user=%1 [L]

из-за этого но! сделал и таким образом (спасибо) - и в таком варианте проявилось это же лайновое но..

!всё на стороне юзера выглядит криво. я так понял это из-за того, что все внутренние функциональные ссылки-то относительные (в хеде на rss,javascript,css и т.п.). Получается браузер не сечёт где он физически находится? Я это , конечно, буду решать тем, что изменю в движке вывод на полноценные ссылки, но что-то здесь не то... По крайне мере посмотрел на пару реализаций динамических поддоменов других сайтов - там ссылки в хеде относительные. Вот, мать их, интересно, как они это всё дело реализовывают-то!? Должно же быть гладкое решение, а то получаются постоянные костыли на каждую проблему.

2012.09.28 19:30:10
#cid42606

Ответить

#cid42594, Cepreu

!всё на стороне юзера выглядит криво. я так понял это из-за того, что все внутренние функциональные ссылки-то относительные (в хеде на rss,javascript,css и т.п.). Получается браузер не сечёт где он физически находится?

На каждом шаге — своя обработка.

1. Клик на ссылку (ввод адреса в адресную строку) — браузер посылает запрос веб-серверу.
2. Веб-сервер понимает, какой URL от него затребовали и прогоняет его по правилам .htaccess
3.1 Если URL попал под какое-то правило с флагом R=301 — происходит редирект. То есть, веб-сервер выдаёт браузеру клиента новый URL, по которому надо перейти. Это всё равно, что клиент тыкнул бы по новой ссылке. Естественно, что в этом случае у пользователя меняется адресная строка — это ж новый сеанс связи, и всё начнинается заново, с пункта 1.
3.2 Если флага R=301 нету — редиректа для клиента не происходит, он находится в рамках первоначального запроса. Преобразованный правилами .htaccess URL "уходит" в скрипты веб-сервера. Эти скрипты видят именно преобразованный URL и работают именно с ним.
4. Скрипт сформировывает HTML и передаёт его веб-серверу.
5. Веб-сервер выдаёт HTML клиенту.

Я это , конечно, буду решать тем, что изменю в движке вывод на полноценные ссылки, но что-то здесь не то... По крайне мере посмотрел на пару реализаций динамических поддоменов других сайтов - там ссылки в хеде относительные. Вот, мать их, интересно, как они это всё дело реализовывают-то!? Должно же быть гладкое решение, а то получаются постоянные костыли на каждую проблему.

У меня объяснение одно: выбранный движок не предполагает использование динамических поддоменов.
То есть, при формировании страниц (и ссылок на них) движок не учитывает, в каком поддомене находится пользователь.

Гость
2012.10.02 22:43:58
#cid42974

Ответить

#cid42606,

А вот фиг у меня получилось с прямыми ссылками. Все ссылки прямо прописанные в 1)php скриптах и 2)файлах шаблонов в браузере выводит с добавлением поддомена.Что за хрень? Пишу везде href="site.ru/images/im.jpg" , при наборе sub.site.ru выводит в хтмл-коде href="sub.site.ru/images/im.jpg", прописываю в скриптах href="www.site.ru", выводит href="www.sub.site.ru", а вот прописываю href="wsite.ru", то и выводит href="wsite.ru". это для меня что-то новое.

2012.10.02 23:29:31
#cid42977

Ответить

#cid42974, Гость

Пишу везде href="site.ru/images/im.jpg"

href="http://site.ru/images/im.jpg", иначе ссылка — относительная.

Гость
2012.10.04 21:35:02
#cid43154

Ответить

#cid42977,

#cid42974, Гость

href="http://site.ru/images/im.jpg", иначе ссылка — относительная.

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

спасибо за советы.

К
2012.10.13 20:10:24
#cid44013

Ответить

Привет. Мучаюсь полдня, ничего не получается. Нужно сделать, чтобы не было прямого доступа к страницы регистрации из вне, т.е. редирект, но чтобы сама страница была доступна на самом сайте по меню.

Вариант до которого пока додумал к сожалению приводит к зацикливанию

RewriteEngine On
DirectoryIndex index.php
RewriteBase /
RewriteRule ^/.htaccess$ - [G]
RewriteCond %{HTTP_REFERER} !^domain\.net/signup\.php$ [NC]
RewriteCond %{REQUEST_URI} ^/signup\.php$ [NC]
RewriteRule (.*) $1? [R=301, L]

К
2012.10.13 20:22:26
#cid44014

Ответить

вот еще поправил мелкие косяки :\

#RewriteCond %{HTTP_REFERER} !^http://500mb\.net/signup\.php$ [NC]
#RewriteCond %{REQUEST_URI} /signup\.php$ [NC]
#RewriteRule (.*) $1? [R=301, L]

К
2012.10.14 20:51:50
#cid44123

Ответить

блин похоже злой админ раздобрел

shan
2012.10.15 13:37:22
#cid44190

Ответить

Прочел все написанное. Однако так и не заработало:
DirectoryIndex index.php
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^news/([0-9]+)/? news/view.php?id=$1 [L]

Нужно, чтобы с главной страницы сайта при клике на ссылку новости генерилась страница (5, это пример) http://site.ru/news/5.

К
2012.10.15 20:34:03
#cid44223

Ответить

Пока ближайший к истене кажется вариант

RewriteEngine on
RewriteCond %{REQUEST_URI} ^signup.php$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.net/.*$ [NC, OR]
RewriteCond %{HTTP_REFERER} !^http://domain\.net/.*$ [NC]
RewriteRule ^signup.php$ http://domain\.net [R,L]

Сергей
2012.10.17 00:19:32
#cid44361

Ответить

Создал строку запрета в файл .htaccess в таком виде:

# с этих ip - адресов раскидывается спам на сайт доски объявлений.
order allow deny
allow from all
deny from 188.143.232.84
deny from 94.23.33.36
deny from 195.62.25.206

После этого страницы всех файлов не открываются выдает ошибку
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request
otdih-krim.ru

Попробовал прописать строку в таком виде:
Order allow deny
allow from all
deny from 188.143.232.84
deny from 94.23.33.36
deny from195.62.25.206

Выдает туже самую ошибку, страницы не открываются

Сейчас поставил строку в таком виде:

#с этих ip - адресов раскидывается спам на сайт доски объявлений.
allow from all
deny from 188.143.232.84
deny from 94.23.33.36
deny from 195.62.25.206

Страницы открываются, но спам не прекратился, значит опять что то не так!!! На сайтах есть разногласия по поводу этих строк. Кто знает подскажите, как точно прописать действующий код запрета с этих Ip - адресов

Сергей
2012.10.24 02:38:22
#cid45138

Ответить

Ни кто не сталкивался что ли?

2012.10.24 15:40:04
#cid45238

Ответить

#cid44223, К

domain.net

Да ты уже засветил свои 500 метров!!!

Попробуй так:

RewriteEngine On
RewriteBase /
...
RewriteCond %{REQUEST_URI} ^/signup\.php [NC]
RewriteCond %{HTTP_REFERER} !^http://domain\.net [NC]
RewriteRule .* http://domain.net [R=301,L]

2012.10.24 16:08:06
#cid45244

Ответить

#cid45138, Сергей

Ни кто не сталкивался что ли?

"Никто" — слитно!

Вообще, htaccess — это файл настроек Апача. В этой заметке разобрана только часть опций этого файла, а именно — обработка входящих запросов. С уклоном на регулярные выражения.

Если твой .htaccess использует именно апач, а не nginx — попробуй так:

Order deny,allow
Deny from 188.143.232.84
Deny from 94.23.33.36
Deny from 195.62.25.206
Allow from all

Но помни: блокировать входящий спам по IP — принципиально неправильный подход. Ты стреляешь по спамерам из пушки. Блокируешь множество потенциальных посетителей (за одним айпишником может скрываться локальная сеть, а то и несколько) из-за одного пидараса.

2012.10.24 16:14:18
#cid45246

Ответить

#cid44190, shan

Нужно, чтобы с главной страницы сайта при клике на ссылку новости генерилась страница (5, это пример) http://site.ru/news/5.

RewriteEngine On
RewriteBase /
...
RewriteCond %{REQUEST_URI} ^/news/([0-9]+)/? [NC]
RewriteRule .* news/view.php?id=%1 [L]

К
2012.11.10 19:17:01
#cid47548

Ответить

ок, работает

Виталий
2012.11.28 16:59:03
#cid49677

Ответить

Помогите пожалуйста решить такой редирект. Есть динамические страницы вида
lib/library/ct.php?frame
lib/library/ct.php?live/1
lib/library/ct.php?blog/4
lib/library/show.php?about/20120318201616
lib/library/show.php?part/20120318200634

нужно сделать 301 редирект с этих и любых их модификаций на главную страницу. Постоянные только адреса lib/library/ct.php и lib/library/show.php, все что после них меняется.

2012.11.28 19:52:16
#cid49696

Ответить

#cid49677, Виталий

Помогите пожалуйста решить такой редирект. Есть динамические страницы вида
lib/library/ct.php?frame
lib/library/ct.php?live/1
lib/library/ct.php?blog/4
lib/library/show.php?about/20120318201616
lib/library/show.php?part/20120318200634

нужно сделать 301 редирект с этих и любых их модификаций на главную страницу. Постоянные только адреса lib/library/ct.php и lib/library/show.php, все что после них меняется.

RewriteEngine On
RewriteBase /
...
RewriteCond %{REQUEST_URI} ^/lib/library/ct\.php$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/lib/library/show\.php$ [NC]
RewriteRule .* ? [R=301,L]

Татьяна
2012.11.29 10:50:59
#cid49737

Ответить

Спасибо вам за информацию! Очень долго искала ответ по редиректу динамических урлов, но только у вас разобралась!!))

2012.11.29 15:10:07
#cid49752

Ответить

#cid49737, Татьяна

Спасибо вам за информацию! Очень долго искала ответ по редиректу динамических урлов, но только у вас разобралась!!))

:)
Пожалуйста!

Олег
2012.12.12 07:26:14
#cid50607

Ответить

Доброе утро! Всю ночь прокавырялся с .htaccess, после того как в выдаче увидел появление страниц типа:

http://www.sait.runwww.sait.ru/

и как только не прописываешь... сайт доступен (http://www.sait.ruggggnwww.sait.ru/ http://www.sait.rggggggghhunwww.sait.ru/)

Как это можно исправить, не подскажите?

Олег
2012.12.12 17:15:32
#cid50628

Ответить

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

2012.12.12 17:20:44
#cid50629

Ответить

#cid50628, Олег

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

Динамические поддомены. Иногда — очень полезная штука. Включается добавлением А-записи "*" в DNS для домена и настройкой (разрешением) на веб-сервере.

А ц-панели у всех разные.

Дмитрий
2012.12.14 16:16:57
#cid50778

Ответить

Добрый день.
Возникло не допонимание как работает htaccess.
Моя задача: запретить пользователю напрямую запускать php скрипты которые динамически формируют страницы на выдачу.
А именно например, если в url попадет `http://www.it-simple.ru/windows.php`
то мы вызываем ошибку 404 ( или перекидываем пользователя на главную ).

Вот часть htaccess:

RewriteEngine On
RewriteBase /
...
RewriteRule ^$ index.php [L]
RewriteRule ^arc/?$ arc.php [L]
RewriteRule ^windows/?$ windows.php [L]
...

2012.12.14 18:17:44
#cid50786

Ответить

#cid50778, Дмитрий

Добрый день.

Добрый.

не допонимание

Правильно так: "недо пони ман ие".

Моя задача: запретить пользователю напрямую запускать php скрипты которые динамически формируют страницы на выдачу.

А зачем? Результатом запроса всё равно будет php-скрипт, даже если он отсутствует в запросе явно.
Например, ссылка на эту страницу [http://www.it-simple.ru/?p=2109] вызывает скрипт index.php в корне сайта. То есть, по сути преобразуется в [http://www.it-simple.ru/index.php?p=2109], только без явного редиректа (без изменения урла).

А именно например, если в url попадет `http://www.it-simple.ru/windows.php`
то мы вызываем ошибку 404 ( или перекидываем пользователя на главную ).

Как вариант:

RewriteEngine On
RewriteBase /
...
RewriteCond %{REQUEST_URI} \.php$ [NC]
RewriteRule .* 404.php [L]
...

Дмитрий
2012.12.17 12:53:25
#cid50995

Ответить

#cid50786,

Добрый день.
Спасибо за ответ.

Но есть маленькое НО.

Как вариант:

RewriteEngine On
RewriteBase /
...
RewriteCond %{REQUEST_URI} \.php$ [NC]
RewriteRule .* 404.php [L]
...

Такой вариант запретит запуск php скриптов, так как они попадают под это условие. А значит пользователь переходя по ссылка меню будет видеть только 404.

По моему так. ( проверено )

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

P.S.
За грамматическую ошибку, которая вас задела, приношу извинение.

2012.12.17 19:30:44
#cid51016

Ответить

#cid50995, Дмитрий

Такой вариант запретит запуск php скриптов, так как они попадают под это условие. А значит пользователь переходя по ссылка меню будет видеть только 404.

Нет. Правила в htaccess оперируют с урлами — с тем, что написано в адресной строке.
Они работают последовательно, видоизменяя урл и подготавливая его для дальнейшего использования веб-сервером.

Если в адресной строке нет явного указания на скрипт php (как и должно быть), наше правило не сработает, перенаправления на 404-ю страницу не случится. Плюс, так как нет редиректа (R=301) сам скрипт 404.php не зациклится, не попадёт под своё же правило.

По моему так. ( проверено )

Проверка могла закончиться неудачей из-за других правил, которые конфликтуют с этим.
Чтобы не гадать — приведи свой htaccess целиком, я скажу в чём ошибка.

не грамотно

А-а-а-а!

За грамматическую ошибку, которая вас задела, приношу извинение.

)
Забей, ничего личного.
Просто ошибки в речи носят вирусный характер. Сначала ты читаешь тексты с ошибками, потом принимаешь ошибки за норму и сам начнёшь их повторять. За последний год этот эффект в рунете стал лавинообразным.

Дмитрий
2012.12.18 11:00:43
#cid51105

Ответить

#cid51016,

( локальная машина )

htaccess в корне

AddDefaultCharset utf-8

ErrorDocument 403 /error/403.htm
ErrorDocument 404 /error/404.htm
ErrorDocument 500 /error/500.htm

Deny from all

php_value include_path c:/www/my.site.rus
php_value date.timezone Europe/Moscow

Options All -Indexes
Options -Multiviews
Options +FollowSymlinks

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^www\.my\.site\.rus$
RewriteRule ^(.*) http://my.site.rus/part/$1 [L,R=301]

RewriteRule ^$ script/_index.php [L]

RewriteRule ^pro/[0-9]{1,4}/?$ script/pro.php [L]
RewriteRule ^search/?$ script/search.php [L]
RewriteRule ^info/?$ script/info.php [L]
RewriteRule ^info/[a-z0-9\-]+/?$ script/info_view.php [L]
RewriteRule ^o/?$ script/o.php [L]
RewriteRule ^o/[a-z]+/?$ script/o.php [L]

RewriteRule ^about/?$ script/about.php [L]
RewriteRule ^about/[a-z]+/?$ script/about.php [L]

RewriteRule ^promo/[a-z0-9\-]+/?$ script/promo.php [L]

htaccess в папке /part/

RewriteEngine On
RewriteBase /part/
RewriteRule ^tool/news/?$ ../script/_news.php [L]
RewriteRule ^tool/news/[0-9]{1,4}/?$ ../script/_news_view.php [L]
RewriteRule ^tool/journal/?$ ../script/_journal.php [L]
RewriteRule ^tool/journal/[0-9]{1,4}/?$ ../script/_article_view.php [L]
RewriteRule ^tool/otveti/?$ ../script/_otveti.php [L]

Надеюсь это прояснит, где я ошибаюсь.

Дмитрий
2012.12.18 13:17:25
#cid51108

Ответить

Попробовал такой вариант. Работает. Насколько это грамотно ?

RewriteCond %{THE_REQUEST} "^(GET|HEAD) (.*)\.php HTTP/[0-9.]+$"
RewriteRule (.*) / [L,R=301]

2012.12.18 15:23:38
#cid51119

Ответить

#cid51105, Дмитрий

Надеюсь это прояснит, где я ошибаюсь.

Рассматриваем только корневой htaccess.

Сразу после "RewriteBase /" у тебя идёт правило, которое избавляется от "www" в урле. Оно — единственное, вызывающее 301-й редирект (т.е. заставляет клиента сделать новый запрос, перейти по изменённому адресу).

Блок, избавляющийся от явного указания скрипта надо ставить сразу после него. Потому что правила, идущие следом, наоборот — приводят запросы к конечным скриптам.
Вобщем, надо получить примерно это:

...
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^www\.my\.site\.rus$
RewriteRule ^(.*) http://my.site.rus/part/$1 [L,R=301]

RewriteCond %{REQUEST_URI} \.php$ [NC]
RewriteRule .* error/404.htm [L]

RewriteRule ^$ script/_index.php [L]
...

#cid51108, Дмитрий

Попробовал такой вариант. Работает.

Keep it simple. Делай проще.
А у тебя — лишнее, ненужное усложнение.

Располагай правила в нужном порядке, и всё будет хорошо.

Дмитрий
2012.12.18 17:30:43
#cid51130

Ответить

#cid51119,

RewriteCond %{REQUEST_URI} \.php$ [NC]
RewriteRule .* error/404.htm [L]

RewriteRule ^$ script/_index.php [L]

Еще раз попробовал ваш вариант, безуспешно - все запросы уходят на 404.htm

Если пробежаться по работе mod_rewrite в получается так.

В %{REQUEST_URI} попадает `script/_index.php`, он (как и все другие) подходит под наше условие, согласно которому нас
уводят на 404.htm

Проверят так:
RewriteCond %{REQUEST_URI} \.php$ [NC]
RewriteRule .* /%{REQUEST_URI} [R=301,L]

2012.12.18 18:44:51
#cid51135

Ответить

#cid51130, Дмитрий

Еще раз попробовал ваш вариант, безуспешно - все запросы уходят на 404.htm

Эммм. После "RewriteBase /" все абсолютные пути считаются от корня сайта и начинаются с символа дроби. То есть, правило

RewriteRule ^$ script/_index.php [L]

должно выглядеть как

RewriteRule ^/$ script/_index.php [L]

То же самое касается и всех остальных правил.
Поэтому, возможно, 404-я ошибка возникает не в результате срабатывания правила, а как результат неверного запроса.

RewriteCond %{REQUEST_URI} \.php$ [NC]
RewriteRule .* /%{REQUEST_URI} [R=301,L]

Такие вещи надо использовать осторожно, R=301 может привести к многократному срабатыванию.
Для проверки значений переменных можно выводить их на страницах или вообще поставить функцию phpinfo().

PS: Проверил у себя, всё работает как надо.
В "%{REQUEST_URI}" лежит часть адресной строки после имени сайта до серверных переменных (до знака вопроса) — ровно как и должно быть.
При запросе "http://www.it-simple.ru/?p=2109" в "%{REQUEST_URI}" лежит "/".

Дмитрий
2012.12.19 03:38:17
#cid51162

Ответить

Здравствуйте!

Помогите пожалуйста, если есть возможность.

У меня имеется следующий код:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?way=$1 [L,QSA]

На основании этого кода запрос site.ru/test перенаправляется на site.ru/index.php?way=test

Можно ли сделать так, чтобы сам файл index.php, если он запрашивается напрямую через браузер запросом http://site.ru/index.php, также обрабатывался через RewriteRule и сервер возвращал http://site.ru/index.php?way=index.php

В данный момент файл index.php, так как он существует, не подпадает под условие RewriteCond %{REQUEST_FILENAME} !-f, а потому для него RewriteRule не работает.

2012.12.19 17:31:28
#cid51211

Ответить

#cid51162, Дмитрий

Добавь ещё одно правило

RewriteCond %{REQUEST_FILENAME} ^/index\.php$
RewriteRule .* index.php?way=index.php [L,QSA]

и помести его перед тем, что есть.

Дмитрий
2012.12.20 02:34:35
#cid51255

Ответить

#cid51162, спасибо большое за ответ.

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

Вот полный код моего htaccess после Вашего добавления:

Options -Indexes

RewriteEngine on

RewriteCond %{HTTP_HOST} ^site\.ru
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=permanent,L]

RewriteCond %{REQUEST_FILENAME} ^/index\.php$
RewriteRule .* index.php?way=index.php [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?way=$1 [L,QSA]

При запросе site.ru/index.php не происходит перенаправления на site.ru/index.php?way=index.php

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

2012.12.20 13:52:40
#cid51279

Ответить

#cid51255, Дмитрий

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

Вот полный код моего htaccess после Вашего добавления:

Забыл "RewriteBase /" после "RewriteEngine on".
Без него "%{REQUEST_FILENAME}" будет равен не "/index.php", а что-то типа "/home/user/www/site/index.php", то есть — полному пути к файлу на сервере. Поэтому правило и не работает.

Дмитрий
2012.12.24 01:29:43
#cid51543

Ответить

#cid51279,

#cid51255, Дмитрий

Забыл "RewriteBase /" после "RewriteEngine on".
Без него "%{REQUEST_FILENAME}" будет равен не "/index.php", а что-то типа "/home/user/www/site/index.php", то есть — полному пути к файлу на сервере. Поэтому правило и не работает.

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

2012.12.24 15:41:27
#cid51578

Ответить

#cid51543, Дмитрий

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

:(

Тогда просьба.
Когда разберёшься, что было не так — отпишись, не оставляй вопрос открытым.

Максим
2012.12.25 12:27:16
#cid51649

Ответить

У меня вот такой вопрос. Вот текст моего .htaccess

DirectoryIndex index.php
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) index.php?%{QUERY_STRING}

Хочу сделать так, чтобы с адресов вида

http://house-project.od.ua/catalog/prodaja-nedvijimosti/prodaja-kommercheskoy-nedvijimosti/page_1/

перенаправлялось на

http://house-project.od.ua/catalog/prodaja-nedvijimosti/prodaja-kommercheskoy-nedvijimosti/?pg=1

Для этого дописал такое правило

DirectoryIndex index.php
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/page_([0-9]*)/$ $1/?pg=$2 [R=301]
RewriteRule ^(.*) index.php?%{QUERY_STRING}

Но перенаправление не работает. Помогите разобраться, пожалуйста.

2012.12.25 16:24:50
#cid51665

Ответить

#cid51649, Максим

Но перенаправление не работает. Помогите разобраться, пожалуйста.

Попробуй так:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/page_([0-9]+)/$ $1/?pg=$2 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]

%{QUERY_STRING} добавлять вручную не надо, он цепляется автоматически.

Максим
2012.12.25 17:51:48
#cid51670

Ответить

#cid51665,

#cid51649, Максим

Попробуй так:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^(.*)/page_([0-9]+)/$ [NC]
RewriteRule .* %1/?pg=%2 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]

%{QUERY_STRING} добавлять вручную не надо, он цепляется автоматически.

Не сработало. Всё так же отдаёт 404 ошибку вместо 301 редиректа.

2012.12.25 18:41:26
#cid51672

Ответить

#cid51670, Максим

Не сработало. Всё так же отдаёт 404 ошибку вместо 301 редиректа.

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

Максим
2012.12.25 18:52:34
#cid51673

Ответить

#cid51672,

#cid51670, Максим

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

Благодарю, так сработало!

Alexxx
2013.01.15 21:21:03
#cid53150

Ответить

Скажите, а как бы аменить один символ в URL другим

было: http://site.com/ru/section-about-mail/
надо: http://site.com/ru/section_about_mail/

Пробовал:
RewriteCond %{QUERY_STRING} ^(.*)-(.*)$ [NC]
RewriteRule ^(.*[s/-/_/g].*)$ $1 [R=301]

Спасибо.

2013.01.15 22:47:35
#cid53162

Ответить

#cid53150, Alexxx

%{QUERY_STRING} — это то, что в урле идёт после знака вопроса. В приведённом примере знака вопроса нет.

Конструкция s/.../.../g в mod_rewrite вроде как неприменима.
(пометил себе для уточнения)

Точно сработает такой вариант:

RewriteRule ^(.*)-(.*)$ $1_$2 [R=301]

но он не очень хороший: будет столько редиректов, сколько символов «-» в адресе.

Так что подобное преобразование правильнее делать в php-скрипте, с редиректом уже оттуда.

Alexxx
2013.01.16 12:49:15
#cid53191

Ответить

но он не очень хороший: будет столько редиректов, сколько символов «-» в адресе.
Так что подобное преобразование правильнее делать в php-скрипте, с редиректом уже оттуда.

Понял, спасибо. В РНР и сделал.

Василий
2013.01.16 19:04:05
#cid53211

Ответить

Ой! Перепутал символы ... прошу прощения. Вот весь текст, как должно быть (предыдущий пост прошу удалить).

Здравствуйте!

Я уже неделю не могу решить вопрос с перенаправлением двух страниц. Везде где искал информацию в основном все копируют друг друга и найти что-то для реализации корректного перенаправления я так и не смог. А может и во мне дело ... не впитал пока сути.

Описание ситуации.
Есть стандартное перенаправление с www.bratko.ru на bratko.ru (т.е. перенаправление с "www" на без "www"). Это перенаправление работает. Вот оно:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.bratko\.ru$ [NC]
RewriteRule ^(.*)$ http://bratko.ru/$1 [R=301,L]

Задача.
Вот надо ещё добавить перенаправление для двух страниц. Я просто дописал для каждой страницы по аналогии коды и получил вот такой общий код:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.bratko\.ru$ [NC]
RewriteRule ^(.*)$ http://bratko.ru/$1 [R=301,L]
## Страница № 1
RewriteCond %{HTTP_HOST} ^ bratko.ru/?Itemid=118$ [NC]
RewriteRule ^(.*)$ bratko.ru/catmagazinestoli/$1 [R=301,L]
## Страница № 2
RewriteCond %{HTTP_HOST} ^bratko.ru/?Itemid=117$ [NC]
RewriteRule ^(.*)$ bratko.ru/catstoliistuliya/$1 [R=301,L]

... и получил ошибку сервера.

Потом пробовал добавить просто строчку

Redirect 301 /?Itemid=118 http://bratko.ru/catmagazinestoli

И безрезультатно.

Вопрос.
Вот как это сделать?!! Пробовал по всякому и ни в какую!

ПС:
1. сайт сразу добавил в закладки, поскольку материал полезный.
2. И ещё, сайт bratko.ru просто взял для примера и понятного изложения материала.

С большим уважением,
Василий.

2013.01.16 20:08:26
#cid53213

Ответить

#cid53211, Василий

Ой! Перепутал символы ... прошу прощения. Вот весь текст, как должно быть (предыдущий пост прошу удалить).

Предыдущий пост скрыл.

Здравствуйте!

Привет.

Задача.
Вот надо ещё добавить перенаправление для двух страниц. Я просто дописал для каждой страницы по аналогии коды и получил вот такой общий код:

Самая распространённая ошибка — делать по аналогии, не разобравшись в сути. Вот ошибки:

1) Без указания «RewriteBase /» ты оперируешь с урлами, которые представляют собой пути к файлам, начиная от корня файловой системы сервера. То есть, запрашивая урл, например, «http://www.it-simple.ru/arc.php?cat=6», ты в «RewriteRule» на самом деле преобразуешь строку типа «/var/www/arc.php» (то, что после знака вопроса — обрабатывается отдельно). А с инструкцией «RewriteBase /» путь укорачивается до «/arc.php».

2) В серверной переменной «%{HTTP_HOST}» хранится исключительно имя хоста, то есть, по сути — доменное имя. Использование этой переменной в фильтре оправдано только для преобразования доменного имени. Для преобразования же самого урла надо использовать «%{REQUEST_URI}»

3) Для операций над частью урла после знака вопроса (часть, предназначенная для "скормки" серверному скрипту) надо брать переменную «%{QUERY_STRING}»

Насколько я понял, тебе нужно следующее:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^www.bratko\.ru$ [NC]
RewriteRule ^(.*)$ http://bratko.ru/$1 [R=301,L]

## Страница № 1
RewriteCond %{QUERY_STRING} ^itemid=118$ [NC]
RewriteRule ^$ catmagazinestoli/? [R=301,L]

## Страница № 2
RewriteCond %{QUERY_STRING} ^itemid=117$ [NC]
RewriteRule ^$ catstoliistuliya/? [R=301,L]

Символы «^$» в «RewriteRule» означают, что правило будет выполнено только для исходных урлов типа «http://bratko.ru/?[...]» (т.е. если запрашивается корень сайта). Знак вопроса в конце строки для преобразования означает, что часть урла после знака вопроса будет отброшена (т.е. «?itemid=...» — уйдёт)

ПС:
1. сайт сразу добавил в закладки, поскольку материал полезный.
2. И ещё, сайт bratko.ru просто взял для примера и понятного изложения материала.

С большим уважением,
Василий.

Многие возвращаются, да :)

Василий
2013.01.16 21:00:36
#cid53217

Ответить

Всё работает! Большое Вам спасибо! Нет ... ОГРОМНОЕ Вам спасибо!

Многие возвращаются, да :)

А я остаюсь!

Василий
2013.01.16 21:16:30
#cid53219

Ответить

Для себя сижу и разбираюсь. Вот можно небольшой вопрос:

Знак вопроса в конце строки для преобразования означает, что часть урла после знака вопроса будет отброшена (т.е. «?itemid=...» — уйдёт)

А почему уйдёт «?itemid=...»?
Знак вопроса в

catstoliistuliya/?

позволяет генерировать из

?itemid=...

именно нужный мне URL, т.е.

catstoliistuliya

Вот я тут что-то не понимаю ... это натолкнуло меня на следующий вопрос:
Если я наберу в URL

bratko.ru/?itemid=117/article

то преобразования в

bratko.ru/catstoliistuliya/article

не произойдёт. Это сложно исправить? Или овчинка выделки не стоит (т.е. перенаправления с bratko.ru/?itemid=117 на bratko.ru/catstoliistuliya уже будет достаточным для избежания появления url типа bratko.ru/?itemid=117/article)?

С уважением,
Василий.

2013.01.16 23:23:41
#cid53232

Ответить

#cid53219, Василий

Допустим, ввожу я адрес сайта:

http://www.it-simple.ru/arc.php?cat=6

Формат этой строки такой:

протокол://поддомен.домен.зона/путь-на-сайте?запрос

путь-на-сайте всегда задаёт скрипт на веб-сервере, которому уйдёт запрос.
Если веб-сервер не сможет определить, какой скрипт должен обработать данный запрос, он выдаст 404 ошибку.

Введённый адрес, попадая HTTP-запросом в веб-сервер, разбирается этим веб-сервером на переменные:

%{HTTP_HOST} = "www.it-simple.ru"
%{REQUEST_URI} = "/var/www/arc.php?cat=6"
%{QUERY_STRING} = "cat=6"
%{REQUEST_FILENAME} = "/var/www/arc.php"
...

Здесь /var/www/ — каталог на веб-сервере, где физически лежат файлы сайта.

В .htaccess, особенно после инструкции «RewriteBase /», эти переменные выглядят уже по-другому:

%{HTTP_HOST} = "www.it-simple.ru"
%{REQUEST_URI} = "/arc.php"
%{QUERY_STRING} = "cat=6"
%{REQUEST_FILENAME} = "/arc.php"
...

Обрати внимание, что из «%{REQUEST_URI}» исчезла часть после вопросительного знака. «RewriteRule» оперирует именно с этой переменной именно в таком виде.

После преобразования «RewriteRule» к урлу добавляется «%{QUERY_STRING}» в первозданном виде.
Для того, чтобы этого не происходило, и нужно добавлять знак вопроса в правиле преобразования:

RewriteRule ^$ catstoliistuliya/? [R=301,L]

Вот и смотри, нужны ли тебе такие дикие урлы:

bratko.ru/?itemid=117/article
Василий
2013.01.17 17:30:44
#cid53291

Ответить

Здравствуйте!

Спасибо за информацию. Дикие урлы не нужны.

С уважением,
Василий.

Lena L.
2013.01.17 19:35:51
#cid53299

Ответить

после закачки .htaccess, нормально работающего на локалке, он перестает работать - выдает страницу 404 вместо переадресации. Eсли сам сайт находится не в корне домена, как прописать RewriteBase?
у сайта такой адрес - http://subdomain.domain.net/site_name_1/index.php

Когда .htaccess лежит в папке site_name_1 - переадресация не происходит.
Когдав папке subdomain - переадресация не происходит.

B RewriteBase стоит /. без RewriteBase вадает error500. переадресация делается так

RewriteRule ^([a-zA-Z]+)/([0-9]+)/([0-9]+)/([\?]+)\.html$ page.php [L]

все файлы с раширением .html должны переадресовываться на страницу page.php

Дмитрий
2013.01.18 15:05:39
#cid53371

Ответить

Приветствую! Подскажите плиз, все перепробовал..
есть:
http://domain.com/?любаяабракадабра
http://domain.com/любая_директория/?любаяабракадабра
нужно, чтобы 301 редиректом на:
http://domain.com/
http://domain.com/любая_директория/

2013.01.18 15:23:23
#cid53374

Ответить

#cid53371, Дмитрий

RewriteRule (.*) $1? [L,R=301]

2013.01.18 15:35:59
#cid53376

Ответить

#cid53299, Lena L.

после закачки .htaccess, нормально работающего на локалке, он перестает работать

Поведение зависит от настроек веб-сервера и от его типа (на новом сервере — у хост-провайдера — может использоваться nginx).

Eсли сам сайт находится не в корне домена, как прописать RewriteBase?

RewriteBase "переставляет" корень файловой системы в корень сайта, укорачивает полный путь к файлам на сервере.
То, что часть сайта лежит в подкаталоге, надо учитывать в правилах.

все файлы с раширением .html должны переадресовываться на страницу page.php

Если я всё правильно понял, то

RewriteRule ^site_name_1/.*.html$ site_name_1/page.php [L,R=301]

Только как page.php узнает, какой html был в запросе?

Дмитрий
2013.01.18 19:25:53
#cid53386

Ответить

Вот такой результат благодаря этой строке на всем сайте
RewriteRule (.*) $1? [L,R=301]
На этой странице обнаружена циклическая переадресация

2013.01.18 20:44:45
#cid53392

Ответить

#cid53386, Дмитрий

Вот такой результат благодаря этой строке на всем сайте
RewriteRule (.*) $1? [L,R=301]
На этой странице обнаружена циклическая переадресация

Ч0рт. Точно. Надо добавить фильтр, чтобы уже переделанные урлы (без запросной части) не попали в цикл.

RewriteCond %{QUERY_STRING} !^$
RewriteRule (.*) $1? [L,R=301]

Дмитрий
2013.01.18 20:53:04
#cid53393

Ответить

Спасибо, сию секунду проверю!

2013.01.21 14:49:00
#cid53578

Ответить

#cid53393, Дмитрий

Спасибо, сию секунду проверю!

И пропал.

К
2013.01.22 01:21:01
#cid53628

Ответить

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

RewriteRule ^.*$ ../code.php?uri=%{REQUEST_URI}&%{QUERY_STRING} [L]

так подозреваю что ../code.php? нужно заменить на ^code.php?

К
2013.01.22 09:46:35
#cid53652

Ответить

Все вопрос снят, RewriteRule ^.*$ /code.php?uri=%{REQUEST_URI}&%{QUERY_STRING} [L]

2013.01.22 19:00:02
#cid53684

Ответить

#cid53628, К

#cid53652, К

Дык.

RewriteRule шаблон подстановка [флаги]

подстановка — это не шаблон, регулярные выражения в ней использовать нельзя.
../ — каталог уровня выше, чем текущий. (по аналогии: ../../ — два уровня выше)

Руслан
2013.01.22 22:56:37
#cid53696

Ответить

Добрый вечер.
Подскажите как избавиться от такой строчки html?start=1 она появляется в результате разрыва страницы в новостях.Проблема в том, что на неё НЕ ставится link rel="canonical", а ставится каноническая ссылка первой страницы новости. В следствии html?start=1 выпадает из индекса. Я подумал, что если сделать http://мой сайт/news/новость такая то .2html , 3html, то canonical будет ставиться и в разрыве.

2013.01.22 23:28:54
#cid53700

Ответить

#cid53696, Руслан

Добрый вечер.
Подскажите как избавиться от такой строчки html?start=1 она появляется в результате разрыва страницы в новостях.Проблема в том, что на неё НЕ ставится link rel="canonical", а ставится каноническая ссылка первой страницы новости. В следствии html?start=1 выпадает из индекса. Я подумал, что если сделать http://мой сайт/news/новость такая то .2html , 3html, то canonical будет ставиться и в разрыве.

Добрый.

Такие изменения надо делать в движке.

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

Руслан
2013.01.23 11:59:32
#cid53729

Ответить

Жаль, но спасибо, что объяснили. В движок я не полезу, а то натворю делов)))
P.S. А Вам можно отправить в личку свой .htaccess файл на проверку. Я его собирал из всех уголков интернета. Мне интересно, что я там наделал)))может и Вы что-то новое увидите.

2013.01.23 18:17:14
#cid53753

Ответить

#cid53729, Руслан

Жаль, но спасибо, что объяснили. В движок я не полезу, а то натворю делов)))
P.S. А Вам можно отправить в личку свой .htaccess файл на проверку. Я его собирал из всех уголков интернета. Мне интересно, что я там наделал)))может и Вы что-то новое увидите.

Можно, конечно. Почта info@it-simple.ru.
Только быстрого ответа не обещаю, анализ может затянуться )

Руслан
2013.01.23 18:29:15
#cid53754

Ответить

#cid53753,

#cid53729, Руслан

Можно, конечно. Почта info@it-simple.ru.
Только быстрого ответа не обещаю, анализ может затянуться )

Спасибо. Высылаю.

Silver
2013.01.27 15:39:18
#cid54000

Ответить

Помогите пожалуйста, есть сайт с ссылками вида:
sitename.com/#!uslugi/cl3q
sitename.com/#!work/c1uz0
sitename.com/#!dikt/c1wdw

Как с них сделать редирект на эти же страницы, но другого сайта? Страниц не много (до 10) тоесть не проблема каждую прописать вручную

samuray7
2013.01.28 15:06:42
#cid54061

Ответить

Добрый день.
Нашел Ваш сайт и почерпнул много полезного. Спасибо Вам за помощь начинающим!
Обращаюсь с просьбой в поске регулярного выражения для специфичной задачи. В коде php есть несколько фильтров, которые вырезают из формируемого движком html кода строки:
. Этот код минимизирует размер сайта... Покопавшись в коде нашел 4 позиции, которые похоже отвечают за это:

1. protected function excludeIf($sType) {

if (preg_match_all('~~is', $this->sHead, $aMatches)) {
foreach ($aMatches[0] as $sMatch) {
preg_match_all('~.*?/([^/]+\.' . $sType . ').*?~', $sMatch, $aExcludesMatches);
$this->aCallbackArgs['excludes'][] = @$aExcludesMatches[1][0];
}
}

2. // remove HTML comments (not containing IE conditional comments).

$this->_html = preg_replace_callback('//' ,array($this, '_commentCB')
,$this->_html);

3. // remove HTML comments

$css = preg_replace('/(?:^\\s*\\s*$)/', '', $css);

4. // remove HTML comments (and ending "//" if present)

$js = preg_replace('/(?:^\\s*\\s*$)/', '', $js);

Суть вопроса такова - как прописать регулярное выражение, которое пропускало бы (не вырезало) из кода только комбинацию какойто_код.

Буду признателен за любую подсказку.

Василий
2013.01.28 23:59:51
#cid54095

Ответить

Здравствуйте!

Скажите, а правильно ли слэш в конце url оставлять?

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^www.bratko\.ru$ [NC]
RewriteRule ^(.*)$ http://bratko.ru/$1 [R=301,L]

## Страница № 1
RewriteCond %{QUERY_STRING} ^itemid=118$ [NC]
RewriteRule ^$ catmagazinestoli/? [R=301,L]

## Страница № 2
RewriteCond %{QUERY_STRING} ^itemid=117$ [NC]
RewriteRule ^$ catstoliistuliya/? [R=301,L]

Если это не правильно, слэш в конце URL, нужно сделать так:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^www.bratko\.ru$ [NC]
RewriteRule ^(.*)$ http://bratko.ru/$1 [R=301,L]

## Страница № 1
RewriteCond %{QUERY_STRING} ^itemid=118$ [NC]
RewriteRule ^$ catmagazinestoli? [R=301,L]

## Страница № 2
RewriteCond %{QUERY_STRING} ^itemid=117$ [NC]
RewriteRule ^$ catstoliistuliya? [R=301,L]

Верно?

С уважением,
Василий.

2013.01.29 00:13:55
#cid54097

Ответить

#cid54095, Василий

Здравствуйте!

Скажите, а правильно ли слэш в конце url оставлять?

Если это каталог или несуществующий путь (виртуальный урл, не соответствующий каталогу или файлу на сервере), то завершающий слэш нужен.
Его можно не ставить, тогда веб-сервер сделает это сам. Лучше ставить.

Василий
2013.01.30 10:53:57
#cid54203

Ответить

Здравствуйте!!!

Вас понял. Только после перенаправления у меня слэш в конце адреса страницы ставился. Если же зайти "нормально" на эту страницу (просто нажать на название соответствующего пункта меню), то url в адресной строке отображался без слэша на конце. В итоге я слэш убрал (способ указал выше #cid54095), т.к. у меня все такие каталоги без слэша и эти два, для порядку, сделал без него.

С уважением,
Василий.

2013.01.30 21:57:58
#cid54238

Ответить

#cid54000, Silver

Помогите пожалуйста, есть сайт с ссылками вида:
sitename.com/#!uslugi/cl3q
sitename.com/#!work/c1uz0
sitename.com/#!dikt/c1wdw

Как с них сделать редирект на эти же страницы, но другого сайта? Страниц не много (до 10) тоесть не проблема каждую прописать вручную

Меня очень смущает знак «#» в урле. Обычно после него идёт имя локального якоря. Эта часть урла должна обрабатываться браузером и на веб-сервер не отправляется.

Надо разобраться в этом вопросе.

А для путей типа
sitename.com/dir/dir0
sitename.com/dir/dir1
sitename.com/dir/dir2
можно сделать так:

RewriteBase /

RewriteRule /dir/dir0 http://othersite.com/dir/dir0 [R=301,L]
RewriteRule /dir/dir1 http://othersite.com/dir/dir1 [R=301,L]
RewriteRule /dir/dir2 http://othersite.com/dir/dir2 [R=301,L]

Если страниц немного — лучше прописать каждую, без "RewriteCond", так будет чуть быстрее обрабатываться.

Руслан
2013.01.31 14:22:33
#cid54280

Ответить

Добры день
Подскажите, как убрать из строки http://moy.sayt/kategoriya/86-material.html номер ID, чтобы остался только материал.

2013.01.31 16:12:45
#cid54286

Ответить

#cid54280, Руслан

Добры день

Добрый.

Подскажите, как убрать из строки http://moy.sayt/kategoriya/86-material.html номер ID, чтобы остался только материал.

В смысле — убрать число "86" из урла?
Как после этого веб-сервер определит, какой материал (под каким ID) нужно отдать?

Руслан
2013.01.31 16:59:51
#cid54290

Ответить

А скрыть, как нибудь? А еще есть страницы где только ID без названия материала, не подскажите почему?

2013.01.31 17:59:43
#cid54294

Ответить

#cid54290, Руслан

А скрыть, как нибудь? А еще есть страницы где только ID без названия материала, не подскажите почему?

Урлы обрабатываются веб-сервером и скриптами движка сайта. Правила htaccess всего лишь "подготавливают" урлы для дальнейшей обработки. Все "типы" урлов, которые способен понять сайт, зависят от существующих правил в htaccess и от алгоритма работы скриптовой части сайта (если она вообще есть).

Руслан
2013.02.01 12:48:51
#cid54344

Ответить

#cid53753,

#cid53729, Руслан

Можно, конечно. Почта info@it-simple.ru.
Только быстрого ответа не обещаю, анализ может затянуться )

Добрый день
Хотел узнать, нет ли интересных новостей о моем файле htaccess? Оставлять как есть или есть какие либо замечания? Здесь было упомянуто об очередности расположения того или иного правила. В моем файле с этим все в порядке? А то мне кажется, что не все работают, например эти
#первоисточник http://www.мой сайт.ua
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/noHL.jpg [L]
RewriteRule ^/.htaccess$ - [G]

Александр
2013.02.03 23:01:21
#cid54509

Ответить

Здравствуйте!
Пытаюсь к своему движку наладить ЧПУ через вот такой .htaccess

AddDefaultCharset utf-8
RewriteEngine on
RewriteRule ^news-([0-9]+)$ news.php?$1
ErrorDocument 404 /moisait.ru/error.php

Всё вроде работает нормально, пока не попробовал в адресную строку вписать javascript с alert и он запустился.
Когда пользую родные ссылки вида moisait.ru/news.php?21
php фильтрует javascript и выдает 404 страницу. Если перехожу на ЧПУ javascript запускается. Что я делаю не правильно. Заранее спасибо тем, кто откликнется.

2013.02.04 20:31:09
#cid54583

Ответить

#cid54509, Александр

Здравствуйте!

Привет.

Пытаюсь к своему движку наладить ЧПУ через вот такой .htaccess

AddDefaultCharset utf-8
RewriteEngine on
RewriteRule ^news-([0-9]+)$ news.php?$1
ErrorDocument 404 /moisait.ru/error.php

Что делает такой .htaccess?

1) ставит апачу кодировку UTF-8 по умолчанию;
2) прописывает адрес страницы, которую нужно выдать при возникновении 404-ой ошибки;
3) включает RewriteEngine;
4) урлы вида "http://moisait.ru/news-[цифры]" переделывает в "http://moisait.ru/news.php?[цифры]", причём делает это только для конечных php-скриптов, адресная строка пользователя не изменится.

Вот и всё.

Всё вроде работает нормально, пока не попробовал в адресную строку вписать javascript с alert и он запустился.

Варианта два. Или жаваскрипт запустился локально вне зависимости от введённого адреса (т.е. браузер даже не стал передавать скрипт серверу, а просто его запустил), или движок схавал жаваскрипт, внедрил его в страницу для выдачи (минус движку, надо разбираться) и всё равно запустил его локально у пользователя.

Жаваскрипт вообще отличается тем, что запускается исключительно у пользователя, в браузере. Это основная концепция и назначение жаваскрипта. Он не запускается на сервере — принципиально не может этого сделать.

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

Когда пользую родные ссылки вида moisait.ru/news.php?21
php фильтрует javascript и выдает 404 страницу. Если перехожу на ЧПУ javascript запускается. Что я делаю не правильно. Заранее спасибо тем, кто откликнется.

Получается второй вариант: php-скрипты внедряют "ручной" жаваскрипт в страницу. Когда используются "родные ссылки", жаваскриптовое добавление находится после знака вопроса — то есть, находится в области переменных для php. Видимо, обработка скриптовых переменных корректно вырезает всякую неопознанную хрень. Но когда скрипт попадает в основной урл — движок почему-то цепляет его к основному коду выдаваемой страницы. Такое моё предположение.

Надо смотреть движок, htaccess тут не при чём.

Александр
2013.02.04 21:57:31
#cid54585

Ответить

И снова здравствуйте! Спасибо за ответ. Всё происходит, так как вы описали.
Если ссылка ЧПУ, то перехода на сайт нет, срабатывает alert и выходит предупреждение Денвера
-----------------------
Forbidden
You don't have permission to access /moisait.ru/news-2315 on this server.
Подсказка Денвера
Возможные причины ошибки:
Вы пытаетесь запустить CGI-скрипт, расположив его вне CGI-директории (например, в директории документов сервера www). Корректные пути к CGI-директориям следующие:
--------------------------
Если ссылка без ЧПУ, так как ссылка не соответствует требуемой, средствами PHP посетитель перебрасывается на 404 страницу и alert не вылазит.
По моему мнению, движок тут не причём, потому что если удалить абсолютно весь код из файла news.php и прописать простое echo с текстом, то перехода на сайт всё равно нет.
Смущают вот что. Если правило в .htaccess вот такого вида
RewriteRule ^news-(.*)$ news.php?$1
По идее оно должно пропустить всё как есть в части (.*), а дальше PHP уже решает, что с этим делать. Но этого не происходит. Думаю, что по любому сначала должен быть переход на страницу, а уже потом по ситуации. Попробовал на alert живые сайты в Интернете, нигде он не срабатывает и перебрасывает на 404 страницу.
Что касается движка, то в файле news.php первым делом идёт проверка, если в GET не число или оно выходит за рамки допустимого, то выдает 404 страницу.

2013.02.05 19:49:13
#cid54652

Ответить

#cid54585, Александр

Смущают вот что. Если правило в .htaccess вот такого вида
RewriteRule ^news-(.*)$ news.php?$1
По идее оно должно пропустить всё как есть в части (.*), а дальше PHP уже решает, что с этим делать. Но этого не происходит. Думаю, что по любому сначала должен быть переход на страницу, а уже потом по ситуации. Попробовал на alert живые сайты в Интернете, нигде он не срабатывает и перебрасывает на 404 страницу.

Чтобы не гадать на пустом месте — нужны, как минимум:
1) файл htaccess, целиком, как есть;
2) пример ввода жаваскрипта в адресную строку.

Александр
2013.02.05 20:38:44
#cid54656

Ответить

Здравствуйте! Спасибо за участие и терпение.
.htaccess весь как есть, я кинул в первом своем посте.
Пример ввода: http://localhost/moisait.ru/news-2315%3Cscript%3Ealert(1);%3C/script%3E
Причем Opera, Mozilla и Explorer запускают скрипт, а Хром, Яндекс и Safari нет, но всё равно переходят на страницу ошибки Денвера.
И повторюсь
localhost/moisait.ru/news.php?2315%3Cscript%3Ealert(1);%3C/script%3E
Как и положено PHP скриптом отфильтровывается и перебрасывается на 404 страницу без запуска javascript.

А
localhost/moisait.ru/news-2315%3Cscript%3Ealert(1);%3C/script%3E
Выдает ошибку Денвера и запуск javascript.

2013.02.05 21:30:21
#cid54659

Ответить

#cid54656, Александр

Здравствуйте! Спасибо за участие и терпение.

Да прекращай.

http://localhost/moisait.ru/news-2315%3Cscript%3Ealert(1);%3C/script%3E

1) RewriteRule ^news-([0-9]+)$ news.php?$1

Урл не попадает под преобразование в htaccess. Ни файла, ни каталога с именем "news-2315%3Cscript%3Ealert(1);%3C/script%3E" на сервере нет, поэтому Денвер выдаёт ошибку 404. Параллельно (и, возможно, из-за возврата 404-ой ошибки!) браузер трактует содержимое адресной строки как скрипт, и выполняет его. Локально. РаспознАет ли браузер скрипт, выполнит ли его — целиком и полностью зависит от способностей и мозгов браузера. Какой из них в данной ситуации поступает корректнее — не могу сказать, не знаю.

2) RewriteRule ^news-(.*)$ news.php?$1

Урл попадает под правило. И преобразуется в "news.php?2315%3Cscript%3Ealert(1);%3C/script%3E" (!). Файл news.php на сервере есть, поэтому 404-ой ошибки нет. Серверная переменная "QUERY_STRING" равна "2315%3Cscript%3Ealert(1);%3C/script%3E", она сохранена на веб-сервере именно в таком виде, но вполне может никак не обрабатываться. И в таком случае "забывается" после выполнения запроса. Если косяков при обработке переменной нет — жаваскрипт никогда не выполнится.

3) "Правильный" урл, "localhost/moisait.ru/news.php?2315%3Cscript%3Ealert(1);%3C/script%3E", по идее не должен попадать под правила вообще (ни под первый вариант правила, ни под второй). Он уже приведён к нужному виду. Он должен запросить файл news.php и далее всё как в пункте 2: жаваскрипт не должен запускаться; но и 404-ая ошибка не должна возникать тоже.

Как-то так.

Александр
2013.02.06 15:54:53
#cid54707

Ответить

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

Предположим у нас есть два файла:
index.php только с вот таким содержимым
echo $_SERVER['REQUEST_URI'];

и файл .htaccess только с вот таким правилом
RewriteEngine on
RewriteRule ^index(.*)$ index.php?$1

Почему при переходе на страницу index.php?% всё корректно работает, а при переходе по адресу index% выходит 400 ошибка. Причем танцы вокруг кодировки файлов и самого Денвера, а также приведение к виду
RewriteRule ^index(.*)\.html$ index.php?$1 с соответствующим запросом index%.html
Ничего не меняют.

2013.02.06 16:49:00
#cid54710

Ответить

#cid54707, Александр

И снова здравствуйте!

Привет.

Почему при переходе на страницу index.php?% всё корректно работает, а при переходе по адресу index% выходит 400 ошибка.

Ошибка 400 — это не ошибка 404. Ошибка 400 — это когда "запрос клиента не может быть понят сервером из-за ошибок в синтаксисе запроса". Синтаксис не тот. До htaccess такой запрос даже не добирается.

Веб-серверу идёт "GET index% HTTP/x.y", символ "%" в урле — это спецсимвол, после которого ожидается двухразрядный шестнадцатеричный код, а его нет. Оп-па, здравствуй, ошибка 400.

Михаил
2013.02.08 00:43:38
#cid54828

Ответить

Здравствуйте ребята, кто нибудь может подсказать, как делать редирект с http://mysite.ru/#down на htt://mysite.ru с помощью .htaccess

Михаил
2013.02.08 00:47:40
#cid54829

Ответить

Точнее нужен редирект с

http://mysite.ru/#down

на

http://mysite.ru

2013.02.08 01:12:23
#cid54831

Ответить

#cid54828, Михаил

Чуть выше есть ответ.

Михаил
2013.02.08 14:22:36
#cid54873

Ответить

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

с

http://mysite.ru/#down

на

http://mysite.ru

2013.02.08 16:22:13
#cid54880

Ответить

#cid54873, Михаил

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

ЦЫтата:

#cid54238,

Меня очень смущает знак «#» в урле. Обычно после него идёт имя локального якоря. Эта часть урла должна обрабатываться браузером и на веб-сервер не отправляется.

«#», он же "диез", он же "решётка" — это спецсимвол в адресной строке. Так же, как символ «%», например. Его наличие в урлах не проходит безболезненно, поэтому использовать нужно с максимальной аккуратностью.

Твой "редирект" сделать нельзя. Ровно потому, что "#down" не отправляется на сервер, это локальная часть урла: указание браузеру спуститься по странице к якорю по имени "down".

Михаил
2013.02.08 18:33:28
#cid54885

Ответить

Спасибо, понятно, буду искать альтернативу, может быть в html или в пхп что-то можно делать.

2013.02.11 02:33:22
#cid54991

Ответить

#cid54885, Михаил

Спасибо, понятно, буду искать альтернативу, может быть в html или в пхп что-то можно делать.

Тогда уж копни в сторону жаваскрипта. Он один работает на стороне клиента, с браузером.

Ярослав
2013.02.19 14:58:57
#cid55491

Ответить

в wordpress установил ЧПУ ссылки с расширением ".html", но сохранились ссылки на страницы без "html", как же в htaccess можно сделать редирект, чтобы ссылки в формате /blah-blah переходили на /blah-blah.html

2013.02.19 15:23:05
#cid55493

Ответить

#cid55491, Ярослав

в wordpress установил ЧПУ ссылки с расширением ".html", но сохранились ссылки на страницы без "html", как же в htaccess можно сделать редирект, чтобы ссылки в формате /blah-blah переходили на /blah-blah.html

RewriteCond %{REQUEST_URI} !.html$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) $1.html [L,R=301]

Поместить надо до непосредственного перенаправления запроса в индексный файл.

Ярослав
2013.02.19 16:04:21
#cid55497

Ответить

Сейчас в файле у меня:
--------------------

RewriteEngine On
RewriteBase /ru/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /ru/index.php [L]

--------------------
Дописываю ниже, но ничего не происходит...

Ярослав
2013.02.19 16:10:17
#cid55499

Ответить

И до и после, получается ссылка - http://www.ышеу.com/ru/blah.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html

2013.02.19 17:38:20
#cid55505

Ответить

#cid55499, Ярослав

И до и после, получается ссылка - http://www.ышеу.com/ru/blah.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html

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

Попробуй так:

RewriteEngine On
RewriteBase /ru/

RewriteCond %{REQUEST_URI} !^.*\.html$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) $1.html [L,R=301]

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /ru/index.php [L]

Ярослав
2013.02.19 17:44:45
#cid55506

Ответить

в принципе срабатывает, но теперь проблема со статическими страницами и разделами, которые имеют ссылки в формате: http://www.site.com/ru/feedback/
теперь к ним дописывается - /ru/feedback/.html

2013.02.19 18:17:01
#cid55508

Ответить

#cid55506, Ярослав

в принципе срабатывает, но теперь проблема со статическими страницами и разделами, которые имеют ссылки в формате: http://www.site.com/ru/feedback/
теперь к ним дописывается - /ru/feedback/.html

Добавь ещё одно условие:

RewriteCond %{REQUEST_URI} !^.*/$

Ярослав
2013.02.19 18:49:35
#cid55513

Ответить

Не получается ;)

RewriteEngine On
RewriteBase /ru/

RewriteCond %{REQUEST_URI} !^.*\.html$
RewriteCond %{REQUEST_URI} !^.*/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) $1.html [L,R=301]

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /ru/index.php [L]

Ярослав
2013.02.19 19:00:04
#cid55514

Ответить

Еще замечу, что на сайте есть ссылки для поиска, которые вводятся в формате - /ru/?s=программа
как я понимаю к ним тоже будет применяться условие - .html, как быть

2013.02.19 19:41:45
#cid55518

Ответить

#cid55513, Ярослав

Не получается ;)

Пишу по памяти, проверить сейчас не на чём :( Показываю направление, дальше сам. Единственная просьба: как разберёшься — напиши, что было не так, не оставляй тему незакрытой, её люди читают.

#cid55514, Ярослав

Еще замечу, что на сайте есть ссылки для поиска, которые вводятся в формате - /ru/?s=программа
как я понимаю к ним тоже будет применяться условие - .html, как быть

Добавить ещё одно условие, проверяющее %{QUERY_STRING}.

Проблема в том, что ты оперируешь с несуществующими путями в урлах. Вот, например, заходишь ты на "http://www.site.dom/someshit". "someshit" — это что? Каталог, или файл (к которому средствами htaccess надо добавить расширение), или просто некая инструкция для скрипта, которая должна обрабатываться в index.php, куда (внимание!) строка "someshit" будет передана вне зависимости от того, что она из себя представляет?

Ярослав
2013.02.20 13:17:06
#cid55584

Ответить

Все каталоги у меня со слешем в конце, а страницы .html
------------------------------
Статическая страница: /ru/about/
Рубрика: /ru/article/
Статья: /ru/stateika.html
Поиск: /ru/?s=статья
------------------------------
за советы спс, когда все соберу в кучу, отпишу.

Михаил
2013.02.20 14:02:03
#cid55589

Ответить

Помогите пожалуйста делать редирект 301 с сохранением пути.

Пример:

с

http://test.info/?list=new&page=1
http://test.net/?list=new&page=1

на

http://test.сom/?list=new&page=1

2013.02.20 20:46:40
#cid55613

Ответить

#cid55589, Михаил

Помогите пожалуйста делать редирект 301 с сохранением пути.

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^(.*\.)test\.info$ [NC,OR]
RewriteCond %{HTTP_HOST} ^(.*\.)test\.net$ [NC]
RewriteRule (.*) http://%{1}test.com/$1 [R=301,L]

Даже поддомены сохранятся, если есть.

Михаил
2013.02.21 16:02:26
#cid55679

Ответить

#cid55613 спасибо большое!!!

Alex
2013.03.04 18:42:22
#cid56404

Ответить

Добрый день! Почитал у Вас сообщения о том, что
RewriteCond %{REQUEST_URI} ^/$
RewriteRule .* index.php [R=301,L]

Добавляет index.php

А как сделать обратное?

из строки урл нужно убрать index.php а то дубли получаются..

сайт.ру/index.php?file=page, нужно что бы преобразование шло с 301 редиректом на сайт.ру/?file=page

и нашел еще один дубль главной http://www.сайт.ru/index.php?file=index

Помогите пожалуйста!

Alex
2013.03.04 19:03:27
#cid56406

Ответить

RewriteCond %{QUERY_STRING} .*index.php
RewriteRule ^(.*)$ /? [R=permanent,L]

Пробовал

RewriteEngine on
RewriteRule ^index.php$ / [R=301,L]

Вот это работает, но правильно ли это?

Удаляет index.php, но остается одна проблема - дубль главной

http://сайт.ru/?file=index

Михаил
2013.03.12 19:25:24
#cid57012

Ответить

Приветствую! Помогите перенаправить субдомены которые начинаются на fun.домен.ru на test.ru

к примеру:

www.fun.domen.ru
fun.domen.ru
fun.test.ru
fun.test.info
fun.test.net

все эти субдомены нужно перенаправить 301 редиректом на http://mydomen.ru, желательно чтобы код был един для всех, а не так чтобы для каждого субдомена отдельный редирект.

2013.03.12 20:21:11
#cid57018

Ответить

#cid57012, Михаил

1) Первым редиректом избавляешься от префикса «www», это полезно для лучшей индексации поисковиками и для единообразия адресов. Пример есть в примерах, пардон за тавталогию, и в комментариях.

2) Вторым правилом проверяешь переменную %{HTTP_HOST} на наличие "fun" в её начале и в зависимости от — делаешь редирект. Этот пример тоже есть в комментариях.

Михаил
2013.03.13 01:26:45
#cid57047

Ответить

Да точняк, спасибо!

Дмитрий
2013.03.19 16:29:33
#cid57575

Ответить

Добрый день.
Не большое вступление.
url /spb/
на сервере есть папка с таким же именем, в ней еще htaccess. ( выполняются свои правила )
url /msk/
та же история, на сервере есть папка с таким же именем, в ней еще htaccess. ( выполняются свои правила )

А теперь сам вопрос.
url /samara/
url /orel/
url /***/
на сервере нет таких папок, но есть папка `rus`.
Что нужно прописать в /htaccess или /rus/htaccess, что бы по этим url сервер заглядывал в /rus/htaccess за правилами.

Зарание спасибо.

2013.03.19 19:14:05
#cid57597

Ответить

#cid57575, Дмитрий

Добрый день.

Добрый.

Не большое вступление.

Надо слитно. ("небольшое", *)

Что нужно прописать в /htaccess или /rus/htaccess, что бы по этим url сервер заглядывал в /rus/htaccess за правилами.

Встречный вопрос: как реализовано перенаправление при запросе несуществующих каталогов samara/, orel/ и т.д. на реальный каталог rus/?
Если средствами корневого .htaccess, то почему бы общие правила не написать там же?

Дмитрий
2013.03.20 10:14:38
#cid57655

Ответить

Надо слитно. ("небольшое", *)

Согласен. ( Совсем не грамотный стал )

Встречный вопрос: как реализовано перенаправление при запросе несуществующих каталогов samara/, orel/ и т.д. на реальный каталог rus/?

Пока не как. В стадии разработки.

Если средствами корневого .htaccess, то почему бы общие правила не написать там же?

Очень много правил. Для каждого региона (spb, msk, rus) свои правила ( до 100 шт. уникальные ).

Дмитрий
2013.03.20 14:12:35
#cid57664

Ответить

Попробовал так в корневом .htaccess, вроде работает.
RewriteRule ^(samara|orel)/(.*) /rus/$2 [L]

2013.03.20 15:39:28
#cid57671

Ответить

#cid57655, Дмитрий

Согласен. ( Совсем не грамотный стал )

Пока не как. В стадии разработки.

"Не грамотный" = "неграмотный", "не как" = "никак" :)))

Очень много правил. Для каждого региона (spb, msk, rus) свои правила ( до 100 шт. уникальные ).

Это много. Ты уверен, что для решения нужной задачи .htaccess — лучший выбор?

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

#cid57664, Дмитрий

Попробовал так в корневом .htaccess, вроде работает.
RewriteRule ^(samara|orel)/(.*) /rus/$2 [L]

Да, именно так.

Для того, чтобы использовать .htaccess из каталога rus/ нужно сделать туда 301-й редирект, но тогда название каталога появится в адресной строке вместо orel/ или samara/. А монтировать один .htaccess из другого, насколько я знаю, невозможно.

Александр
2013.03.20 18:33:16
#cid57690

Ответить

Злой Админ, помоги пожалуйста. Есть урл типа:

site.ru/page1/page2?q=text1234

Нужно преобразовать в:

site.ru/page1/page2

Очень прошу... Горю, как надо... У самого ничего не вышло.

2013.03.20 18:54:03
#cid57695

Ответить

#cid57690, Александр

RewriteRule (.*) $1? [L,R=301]

— обрезает QUERY_STRING (то, что после знака вопроса включительно) в урле.

В комментариях было.

Александр
2013.03.20 20:17:21
#cid57705

Ответить

Видел. Пробовал:
RewriteCond %{QUERY_STRING} !^$
RewriteRule (.*) $1? [L,R=301]

Все равно циклическая переадресация...

2013.03.20 20:53:39
#cid57707

Ответить

#cid57705, Александр

Все равно циклическая переадресация...

Так быть не должно. Других правил, которые могли бы сформировать QUERY_STRING из пустого — нет?

Попробуй посмотреть логи сервера (какие запросы идут) или сделай тестовое правило (например, RewriteRule (.*) $1-%{QUERY_STRING}?).

И просьба: отпишись, как разберёшься, что было не так.

Александр
2013.03.20 21:48:18
#cid57714

Ответить

С этим:

RewriteRule (.*) $1-%{QUERY_STRING}?

Ошибка 500.
Других QUERY_STRING в .htaccess нет.

Александр
2013.03.20 21:54:56
#cid57715

Ответить

Могут ли мешать строчки php?:

$str = $_SERVER['REQUEST_URI'];

Или какие нибудь вроде них.

2013.03.20 23:01:16
#cid57724

Ответить

#cid57714, Александр

Ошибка 500.

Вот теперь точно надо логи сервера смотреть.

#cid57715, Александр

Могут ли мешать строчки php?:

PHP может вызвать 500-ую ошибку (что само по себе некорректно) и может делать редирект, который приводит к указанному зацикливанию. Так что общий ответ — да, ошибки могут быть вызваны скриптами PHP.

$str = $_SERVER['REQUEST_URI'];

Если ошибка в скриптах — тебе предстоит многочасовая и кропотливая работа, чтобы её найти. С большой вероятностью поломать что-то в другом месте в результате её исправления. :)))
Здесь переменной $str из скрипта PHP присваивается значение из адресной строки браузера. Безопасная операция.

Дмитрий
2013.03.21 12:38:03
#cid57761

Ответить

#cid57671,

Для того, чтобы использовать .htaccess из каталога rus/ нужно сделать туда 301-й редирект, но тогда название каталога появится в адресной строке вместо orel/ или samara/. А монтировать один .htaccess из другого, насколько я знаю, невозможно.

Нет, не появляется, в адресной строке остается orel/ или samara/.
RewriteRule ^(samara|orel)/(.*) /rus/$2 [L] - это просто правило сервера, к адресной строке отношения не имеет. Оно заставляет сервер просто заглянуть в папку /rus/, там он видит htaccess и далее идет обработка.
А если бы я поставил [L,R=301] тогда вы правы, это был бы редирект и адресная строка конечно была бы /rus/

Дмитрий
2013.03.21 12:49:56
#cid57762

Ответить

#cid57671,

Это много. Ты уверен, что для решения нужной задачи .htaccess — лучший выбор?

Для данной ситуации да. Раньше решалось все на php.

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

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

2013.03.21 18:19:04
#cid57786

Ответить

#cid57761, Дмитрий

Нет, не появляется, в адресной строке остается orel/ или samara/.

Это если без R=301, а я говорил именно про явный редирект.

Оно заставляет сервер просто заглянуть в папку /rus/, там он видит htaccess и далее идет обработка.

А вот этого не знал. Ну, то, что дочерние .htaccess цепляются сервером при изменении урла, но без явного редиректа. Спасибо!

#cid57762, Дмитрий

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

С учётом предыдущей информации это всё упрощает, да.

Elena
2013.03.22 13:30:07
#cid57843

Ответить

Добрый день подскажите пожалуйста как сделать Redirect 301 для страниц с
www.site.ru/vorota?error=404&start=18
на www.site.ru/vorota
и
с www.site.ru/vorota?start=12
на www.site.ru/vorota

www.site.ru/vorota?limitstart=0
на www.site.ru/vorota

2013.03.22 15:58:01
#cid57860

Ответить

#cid57843, Elena

Надо убрать из урла запросную часть (то, что после знака вопроса включительно). Было в комментариях.

Евгений
2013.04.04 18:11:55
#cid58855

Ответить

Здравствуйте!

Можно вообще из адресной строки вырезать символ вопроса, чтобы исключить любые запросы?
например:
site.ru? редирект на site.ru или 404.php
site.ru/dir? редирект на site.ru/dir или 404.php

или по другому

site.ru/? редирект на site.ru или 404.php
site.ru/dir/? редирект на site.ru/dir/ или 404.php

Просмотрел всю страницу примеров, пробовал следующее:

RewriteCond %{QUERY_STRING} !^$
RewriteRule (.*) $1? [L,R=301]

но этот пример только убирает любой вариант запроса, а как вообще убрать возможность выполнять запрос?
или это средствами php только?

Что лучше: обрезка параметров или редирект на 404 ?
Виртуальные каталоги лучше вида /dir/ или /dir ?

2013.04.04 21:14:48
#cid58862

Ответить

#cid58855, Евгений

но этот пример только убирает любой вариант запроса, а как вообще убрать возможность выполнять запрос?

Это правило убирает запросную часть из урла. То есть, даже если в скриптах есть код для обработки %{QUERY_STRING} — он никогда не сработает, потому что итоговые HTTP-запросы тупо не будут содержать %{QUERY_STRING}.

или это средствами php только?

Если в скриптах нет кода для обработки запросной части урла — она и не будет обработана.

Что лучше: обрезка параметров или редирект на 404 ?

Смотря в каких целях.
Чаще всего обрезают урл и дают страничке спокойно загрузиться. Иначе "старые" ссылки со сторонних сайтов перестанут работать, что нехорошо.

Виртуальные каталоги лучше вида /dir/ или /dir ?

Опять же, смотря для чего.
Если конечная точка подразумевает каталог (по смыслу ссылки), то лучше "/dir/", если файл, то "/dir". Эта проблема скорее косметического, а не функционального характера.

Евгений
2013.04.04 22:30:49
#cid58866

Ответить

прошу прощения, изменял уже пример для теста:

RewriteCond %{QUERY_STRING} ^([a-z]) [NC]
RewriteRule (.*) $1? [R=301,L]

в данном случае режет только если после вопроса что-либо стоит между a-z

Следующий пример почему то даёт неверное перенаправление ((

RewriteCond %{QUERY_STRING} !^$
RewriteRule (.*) $1? [L,R=301]

так и не разобрался как быть в таких случаях?

site.ru/dir/? или site.ru/dir?

чтобы вопрос обрезался

Евгений
2013.04.04 22:50:16
#cid58870

Ответить

Исправил ошибку, теперь:

RewriteCond %{QUERY_STRING} !^$
RewriteRule (.*) $1? [L,R=301]

убирает всё, что после вопроса, например:
при запросе /dir?a режет строчку в /dir

при запросе /dir? - не реагирует, потому, что в условии стоит резать всё только после вопроса.
Как же сам вопрос срезать? :)

2013.04.05 14:24:22
#cid58919

Ответить

#cid58870, Евгений

при запросе /dir? - не реагирует, потому, что в условии стоит резать всё только после вопроса.
Как же сам вопрос срезать? :)

Отличный вопрос :)
Не знаю. Если узнаю — отпишу. Если выяснишь раньше — будь другом, отпиши тоже.

Виталий
2013.04.05 16:24:46
#cid58926

Ответить

Хорошая статья. Но комментарии — это просто школа жизни!!! Вне всяких похвал!!! Огромнейшее спасибо АДМИНУ за его выдержку и знание дела! Меня эти комменты очень неплохо поднатаскали в плане регулярных выражений.
С уважением!

2013.04.05 18:03:02
#cid58931

Ответить

#cid58926, Виталий

Статья немного устарела уже, требует переработки и дополнения. Надо бы заняться, всё никак руки не дойдут.
Но если она помогает разобраться даже в таком виде — это хорошо.

Пожалуйста! :)

Денис
2013.04.05 20:07:58
#cid58943

Ответить

Добрый день, админ!

подскажите пожалуйста, что у меня не так: как заменить
http://www.domain.com/news.php?id_news=42
на
http://www.domain.com/news/42

у меня прописано
RewriteEngine On
RewriteBase /
RewriteRule ^.htaccess$ - [F]
RewriteRule ^news/([0-9]+)/? news.php?id_news=$1

2013.04.05 22:07:25
#cid58951

Ответить

#cid58943, Денис

Добрый день, админ!

Добрый вечер :)

подскажите пожалуйста, что у меня не так

1) Нету проверки и подстановки %{QUERY_STRING}.
2) Важно помнить, что в шаблоне RewriteRule НЕ участвует запросная часть урла (там нет того, что после знака вопроса)
3) В последнем правиле перепутаны местами позиции — что на что заменяем.

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

RewriteCond %{QUERY_STRING} ^id_news=([0-9]+)$
RewriteRule /news.php /news/%1 [L,R=301]

Денис
2013.04.05 22:30:59
#cid58955

Ответить

не работает ((
в чем может быть еще проблема?
может на хостинге что-то не так?

2013.04.05 23:52:06
#cid58960

Ответить

#cid58955, Денис

Ступил, поторопился. Поменял свой предыдущий комментарий. Попробуй теперь так, как там написано.

Денис
2013.04.06 01:24:36
#cid58967

Ответить

#cid58960,

Ступил, поторопился. Поменял свой предыдущий комментарий. Попробуй теперь так, как там написано.

Извините, что так поздно, но все равно не меняется ничего. Mod-rewrite работает, так как расширение во всех файлах пропало.
Сервер ошибок не выдает... Какой-то полтергейст ))
На всякий случай еще раз выложу файл

RewriteEngine On
RewriteBase /

ErrorDocument 404 /error.php

# скрытие файла
RewriteRule ^.htaccess$ - [F]

# ЧПУ новостей
RewriteCond %{QUERY_STRING} ^id_news=([0-9]+)$
RewriteRule /news.php /news/%1 [QSA,L,R=301]

# удаление пхп в конце
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/? /$1.php [L,NC]

Денис
2013.04.07 14:10:42
#cid59065

Ответить

#cid58967, Денис

заменил в файле строки по удалению расширения файла на
RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L]
в результате заработала корректно страница 404

Но ЧПУ новостей так и не запустилось ((

2013.04.07 18:34:28
#cid59079

Ответить

#cid58967, Денис

Извините, что так поздно

— Полвторого ночи! Выключите комментарии!!!

С приходом нового коммента у меня в хате сигнализация не включается, так что ничего страшного. :)

На всякий случай еще раз выложу файл

В смысле — "ещё раз"?!

RewriteRule /news.php /news/%1 [QSA,L,R=301]

RewriteRule ^/?news\.php$ news/%1 [L,R=301]

Попробуй так. И я настаиваю на том, чтобы ты таки убрал QSA.

# удаление пхп в конце

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

2013.04.07 20:20:07
#cid59087

Ответить

#cid59065, Денис

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/? /$1.php [L,NC]

Что делало это правило раньше? Искало урлы типа "какой-то файл или каталог в корне сайта со слешем или без него в конце", потом проверяло, что это не файл. И если все эти условия совпадали — лепило расширение .php к урлу. Всё это происходило без редиректа (ты не видел результат трудов) и вне зависимости от регистра букв шаблона (при том, что букв в шаблоне нет).

RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L]

[^/]+/ — Набор любых символов, кроме символа дроби, ненулевой длины и заканчивающийся символом дроби.
([^/]+/)* — Ты хотел разобрать урл по каталогам? Повторить шаблон? Насколько я знаю, оно так не работает.
[^.]+ — После последнего символа дроби должен быть ряд символов, исключающих точку.
Тогда к этому ряду будет прилеплено расширение .php

Не понимаю.

sonario
2013.04.10 15:11:42
#cid59324

Ответить

Здраствуйте подскажите пожалуйста.

Есть скрипт с таким кодом

RewriteEngine On

RewriteOptions
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.+) /index.php [L]

любая писанина в адресе (типа http://site.ru/1223213421432142134) ведёт на главную.

Если изменить на

RewriteEngine On

RewriteOptions
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.+) /index.php [L]
ErrorDocument 404 /404.html

толку нет, а если убрать RewriteRule ^(.+) /index.php [L] то все ссылки на сайте вылетают в 404

Как грамотно прописать 404 ошибку

2013.04.10 19:24:52
#cid59347

Ответить

#cid59324, sonario

Как грамотно прописать 404 ошибку

Убрать всё и оставить единственную строку:

ErrorDocument 404 404.html

Поставить её до правил mod_rewrite.

sonario
2013.04.10 20:39:48
#cid59356

Ответить

#cid59347,

#cid59324, sonario

Убрать всё и оставить единственную строку:
ErrorDocument 404 404.html

Поставить её до правил mod_rewrite.

Всё вылетает в 404 даже главная.

Вот полный htaccess

php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2047
DirectoryIndex index.php
Order allow,deny
Allow from All

RewriteEngine On
RewriteOptions
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.+) /index.php [L]

2013.04.10 21:06:51
#cid59358

Ответить

#cid59356, sonario

Вот этот вот блок:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.+) /index.php [L]

свойственен различным движкам, которые любой урл скармливают точке входа index.php. В этом случае парсирование урла происходит средствами PHP и 404-ую ошибку нужно обрабатывать тоже средствами PHP. Как правило, путь к 404-ой странице задаётся в морде для настроек движка.

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

Если ты используешь виртуальные урлы — забудь про инструкцию "ErrorDocument" и ищи соответствующую настройку в движке.

Если ты используешь реальные урлы (ссылки на реальные, существующие на веб-сервере файлы) — забудь про блок для перенаправления, процитированный выше. И вместо всех инструкций mod_rewrite поставь одну для веб-сервера: "ErrorDocument 404 /404.html"

Артур
2013.04.17 03:04:09
#cid59792

Ответить

Добрый день,

долго искал толковый сайт по htaccess, и ваш сайт действительно самый лучший. Очень понятно и доступно всё расписано. Однако после написания своего htaccess у меня осталась пара вопросов к вам.

Вот мой код:

=================================
ErrorDocument 404 /404.php

RewriteEngine on
Options +FollowSymlinks
RewriteBase /

RewriteCond %{HTTP_HOST} ^domain.com$
RewriteCond %{REQUEST_URI} !^/admin
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^content/([0-9]+)/([^/]+)/$ /content.php?id=$1&dir=$2 [L,QSA]
=================================

Мне нужно настроить мобильную версию сайта. Сейчас субдомен m.domain.com отображает то же самое содержимое, что и domain.com
Я прописал следующие правила в дополнение к вышенаписанному коду:

=================================
RewriteCond %{HTTP_HOST} m\.domain\.com$ [NC]
RewriteRule ^index.php /index_mobile.php [L,QSA]

RewriteRule ^content/([0-9]+)/([^/]+)/$ /content_mobile.php?id=$1&dir=$2 [L,QSA]
=================================

Подскажите, насколько корректен мой код? Нужно ли экранировать точки в RewriteCond? Нужны ли флаги NC для субдомена? Нужно ли экранировать точки в RewriteRule?

Спасибо заранее!

Дмитрий
2013.04.17 14:56:03
#cid59833

Ответить

Добрый день.
Можно ли при помощи htaccess выловить определенный POST запрос и запретить его или отправить обратно отправителю.
Суть проблемы вот в чем:
Один бот натравлен на сайт. В течении часа отправляет один и тот-же POST запрос около 40 тыс раз.
На следующий день он это делает уже с другого IP, но запрос тот-же.
Все это записывается в log в виде ошибки.
Просто раньше с таким не сталкивался.
Заранее спасибо.

2013.04.17 17:47:56
#cid59857

Ответить

#cid59792, Артур

Добрый день,

Добрый.

долго искал толковый сайт по htaccess, и ваш сайт действительно самый лучший. Очень понятно и доступно всё расписано.

Не, тут много всего ещё нужно исправлять и дописывать. Но — спасибо.

ErrorDocument 404 /404.php

RewriteEngine on
Options +FollowSymlinks
RewriteBase /

Опции лучше группировать по смыслу. Типа того:

Options +FollowSymlinks
ErrorDocument 404 /404.php

RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_HOST} ^domain.com$

"^domain.com$" — это шаблон. В шаблонах точка экранируется, иначе она является метасимволом и обозначает произвольный символ. То есть, под твой текущий шаблон попадут строки "domain-com", "domain5com" или "domainаcom". Понятно, что эти строки никогда не окажутся в серверной переменной %{HTTP_HOST} — веб-сервер не даст. Понятно, что правило в нынешнем виде нормально работает — точка это тоже символ. Но — "неаккуратненько".

RewriteCond %{HTTP_HOST} m\.domain\.com$ [NC]

Здесь с точками всё нормально, но начало строки не указано. Под шаблон попадут имена типа "xlam.domain.com" или "om-nom-nom-nom.domain.com" — то есть, любые поддомены, заканчивающиеся на «m».

RewriteRule ^content/([0-9]+)/([^/]+)/$ /content_mobile.php?id=$1&dir=$2 [L,QSA]

Повтори поддоменный RewriteCond, иначе это правило законфликтует с правилом для основного домена.

Подскажите, насколько корректен мой код? Нужно ли экранировать точки в RewriteCond? Нужны ли флаги NC для субдомена? Нужно ли экранировать точки в RewriteRule?

1. Точки нужно экранировать в шаблонах. Шаблоны есть как в RewriteCond, так и в RewriteRule.
Если точку не заэкранировать, это не поломает шаблон (символ "точка" попадёт под метасимвол "точка"), но существенно увеличит количество строк, которые под него попадают (под метасимвол "точка" может попасть вообще любой символ, и обычная точка — это всего лишь частный случай).

2. Флаг [NC] не повредит практически во всех местах, где допустим ручной ввод человеком (имя домена — да, человек мог задеть капс; запросная часть урла — нет, нефиг пользователю лезть туда руками).

3. Правила RewriteRule надо максимально уточнять предшествующими фильтрами RewriteCond.

Спасибо заранее!

Пожалуйста )

2013.04.17 22:11:58
#cid59881

Ответить

#cid59833, Дмитрий

Добрый день.

Добрый.

Можно ли при помощи htaccess выловить определенный POST запрос и запретить его или отправить обратно отправителю.

Не знаю. Не уверен.

Файл .htaccess служит для "подстройки" всего веб-сервера при доступе к конкретному сайту. Есть ряд стандартных настроек, и они не умеют работать с данными POST.

В этом же файле можно настраивать модули, подключаемые к веб-серверу. Одному из них, mod_rewrite, и посвещена данная заметка. Насколько я знаю, он тоже не умеет работать с POST.

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

Суть проблемы вот в чем:
Один бот натравлен на сайт. В течении часа отправляет один и тот-же POST запрос около 40 тыс раз.
На следующий день он это делает уже с другого IP, но запрос тот-же.

По-хорошему, такие вещи надо отсекать на уровне ОС или веб-сервера. Чем ниже уровень — тем выше эффективность. Если нет возможности настроить ОС или веб-сервер — остаются только программные средства сайта.

Как вариант, можно написать скрипт типа какого-нибудь "killbot.php". Главное, чтобы он был небольшим и автономным (для максимально быстрой обработки). Перенаправь все входящие запросы на него, и пусть он рубит ботов, пропуская на сайт добросовестных пользователей.

Ещё проще — подключить фильтр в начало своего index.php. В твоём частном случае — что-то типа такого:
if ( isset($_POST) & ($_POST===array(...)) ) die("нахуй");

Все это записывается в log в виде ошибки.

И это правильно. Логи для этого и нужны.

Просто раньше с таким не сталкивался.

К сожалению, всякие сетевые пидарасы в одночасье не исчезнут, предпосылок к этому нет. Ситуация, с которой ты столкнулся, обязательно повторится снова, поменяются только незначительные мелочи.

Надо сесть, хорошенько подумать и найти самое скорострельное и универсальное решение, которое позволяют реализовать твои возможности.

Заранее спасибо.

Пожалуйста.

Артур
2013.04.17 23:11:43
#cid59886

Ответить

#cid59857,

Сразу хочу сказать огромное спасибо за быстрый и чёткий ответ :)

"^domain.com$" — это шаблон. В шаблонах точка экранируется.

С экранированием точек понятно, спасибо огромное.
А если у нас будет такое правило, в отдельном htaccess файле, в папке razdel:

Redirect 301 /razdel/old.html /razdel/new/

В таком случае надо точку экранировать?

Понятно, что эти строки никогда не окажутся в серверной переменной %{HTTP_HOST} — веб-сервер не даст.

Т.е. для редиректа домена с без www на www правильнее всего прописать так:

RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/admin
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

Верно? Причём у меня сейчас флаги NC не прописаны, а при запросе Domain.com меня всё равно редиректит на www.domain.com

Повтори поддоменный RewriteCond, иначе это правило законфликтует с правилом для основного домена.

А вот почему для каждого конфликтного правила надо прописывать? Разве не должен применяться последний использующийся RewriteCond?

И еще последний вопрос: чем принципиально отличается шаблон ^(.*)$ от шаблона ^([^/]+)$ ? Что правильнее использовать? У моей CMS в дефолтовом htaccess файле есть правила:

RewriteRule ^folder/([^/]+)/$ /folder.php?dir=$1 [L,QSA]
RewriteRule ^categories/(.*)/$ /categories.php?category=$1 [L,QSA]

В чём смысл в одном правиле использовать (.*) , а в другом, похожем правиле, ([^/]+) ? Ошибка разработчиков?

Спасибо!

2013.04.18 05:00:53
#cid59910

Ответить

#cid59886, Артур

Сразу хочу сказать огромное спасибо за быстрый и чёткий ответ :)

:)

А если у нас будет такое правило, в отдельном htaccess файле, в папке razdel:

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

Redirect 301 /razdel/old.html /razdel/new/

В таком случае надо точку экранировать?

Насколько я знаю, опция "Redirect" не работает с шаблонами — то есть, экранировать нечего. Шаблон — это объект для сравнения. К примеру (и упрощая), формат опций "RewriteCond" и "RewriteRule" такой:

RewriteCond [переменная] [шаблон]
RewriteRule [шаблон] [подстановка]

Т.е. для редиректа домена с без www на www правильнее всего прописать так:

RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/admin
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

Верно?

Да. И вторую строку можно смело выбросить, тут она лишняя. Ну, если не имеет какого нибудь сакрального смысла — типа доступ ко всему сайту происходит с принудительным "www" и только для доступа к админке адрес надо обязательно вводить без "www". Если так — пересмотри свою систему безопасности, а строчку всё равно удали :)

Причём у меня сейчас флаги NC не прописаны, а при запросе Domain.com меня всё равно редиректит на www.domain.com

Может, файловая система сервера нечувствительна к регистру; может, где-то в глубине веб-сервера стоит какой-нибудь глобальный [NC] или приведение к нижнему регистру; хз.

А вот почему для каждого конфликтного правила надо прописывать? Разве не должен применяться последний использующийся RewriteCond?

Ты неправильно понимаешь работу фильтров.

1. Сначала сервер проверяет, удовлетворяет ли урл шаблону из "RewriteRule".
Тому, который "RewriteRule [шаблон] ...".
Одновременно происходит инициализация переменных типа $1, $2 и т.д. из групп в шаблоне.

2. Только потом идёт проверка на соответствие вышестоящих "RewriteCond" и забор переменных типа %1, %2 и т.д. уже из тамошних шаблонов.

То есть, "RewriteCond" — это уточнение, дополнительная проверка к нижестоящему "RewriteRule" (!!!).

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

4. К следующему "RewriteRule" урл приходит уже в преобразованном, а не в первоначальном виде.

И еще последний вопрос: чем принципиально отличается шаблон ^(.*)$ от шаблона ^([^/]+)$ ? Что правильнее использовать?

^(.*)$ — задаёт всю строку от начала до конца и вне зависимости от содержимого. Всё содержимое попадает в переменную $1 (или %1, если шаблон находится в "RewriteCond").

^([^/]+)$ — задаёт строку ненулевой длины (первое отличие: в строке должен быть хотя бы один символ!) и без "косых" — они же "слэши", они же "/" — внутри (второе отличие: строка не может представлять из себя путь к файлу или каталогу в несколько уровней!). Группировка по переменным — та же.

Использовать надо разное, в зависимости от разных обстоятельств.

RewriteRule ^folder/([^/]+)/$ /folder.php?dir=$1 [L,QSA]

Путь "folder/xxx/alexandra_serova/" — в пролёте.

RewriteRule ^categories/(.*)/$ /categories.php?category=$1 [L,QSA]

Путь "categories/xxx/alexandra_serova/" — будет преобразован: "/categories.php?category=xxx/alexandra_serova"

В чём смысл в одном правиле использовать (.*) , а в другом, похожем правиле, ([^/]+) ? Ошибка разработчиков?

В данном случае смысла не вижу. Может, движок поддерживает одноуровневые каталоги, но многоуровневый рубрикатор?

А может и косяк. Не ошибка, но недоработка.

Спасибо!

И снова пожалуйста :)

Артур
2013.04.18 12:37:23
#cid59945

Ответить

#cid59910,

Насколько я знаю, опция "Redirect" не работает с шаблонами — то есть, экранировать нечего. Шаблон — это объект для сравнения.

Понял, спасибо.

RewriteRule [шаблон] [подстановка]

В комментариях ты одному человеку писал следующее:

RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^(.*)\.php\?(.*)$ $1\.php [R=301,NC,L]

Т.е. в подстановке ТОЖЕ происходило экранирование точки. Я думал, что экранировать надо только в шаблоне. Тогда как будет правильнее в моём случае:

RewriteRule ^sitemap\.xml$ /sitemap.php [L,QSA]

или всё-таки

RewriteRule ^sitemap\.xml$ /sitemap\.php [L,QSA]

Да. И вторую строку можно смело выбросить, тут она лишняя.

Да это заморочки моей CMS :) Доступ в админку возможен только как domain.com/admin, без www.

Ты неправильно понимаешь работу фильтров.
{skip}

Спасибо, теперь намного понятнее.

В данном случае смысла не вижу. Может, движок поддерживает одноуровневые каталоги, но многоуровневый рубрикатор?

Движок очень навороченный, может и так, надо будет еще разбираться :)

P.S. У тебя есть какой-либо кошелёк? Paypal, WM, QIWI, Paxum, eCoin? Я хочу подкинуть копейку на развитие проекта. Можно в gmail почту. Логин: arthur.aka.steelart

Дмитрий
2013.04.18 15:41:45
#cid59959

Ответить

#cid59881
Спасибо за ответ.

Файл .htaccess служит для "подстройки" всего веб-сервера при доступе к конкретному сайту. Есть ряд стандартных настроек, и они не умеют работать с данными POST.

Может как нибудь с помощью этого можно организовать.
%{REQUEST_METHOD} POST
%{REMOTE_ADDR}

И это правильно. Логи для этого и нужны.

Согласен, но когда кол-во записей достигает несколько десятков тысяч ( одинаковых ) за сутки, то это немного мешает выявлять реальные ошибки.

2013.04.18 17:01:07
#cid59964

Ответить

#cid59945, Артур

В комментариях ты одному человеку писал следующее:

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

RewriteRule ^sitemap\.xml$ /sitemap.php [L,QSA]

Так правильно.

P.S. У тебя есть какой-либо кошелёк? Paypal, WM, QIWI, Paxum, eCoin? Я хочу подкинуть копейку на развитие проекта. Можно в gmail почту. Логин: arthur.aka.steelart

Кошелёк есть, денег не нужно, спасибо.

Если когда-нибудь решу собирать деньги с сайта — об этом узнают все посетители сразу, ибо будет поставлено на поток :)

2013.04.18 17:30:06
#cid59973

Ответить

#cid59959, Дмитрий

Может как нибудь с помощью этого можно организовать.
%{REQUEST_METHOD} POST
%{REMOTE_ADDR}

Так можно срезать непричастных, а это нехорошо.
Плюс, насколько я понимаю, при таком способе надо будет каждый день редактировать .htaccess и это неправильно.

Чем тебе не нравится скриптовый вариант?

Согласен, но когда кол-во записей достигает несколько десятков тысяч ( одинаковых ) за сутки, то это немного мешает выявлять реальные ошибки.

Дык — напиши фильтр. Тем более, что с ростом посещаемости (даже без атак дятлов) без него вообще никак. С чистыми логами становится невозможно работать, нужна сводная информация.
Тем не менее, в логах должна оставаться вся информация, в том числе и об атаках.

Стараясь убрать записи из лога, ты борешься с симптомами, а не с причиной.

Огради сайт от атак, но пусть информация о них попадает в логи, это очень полезно.

Руслан
2013.04.24 15:33:37
#cid60365

Ответить

#cid53753,

#cid53729, Руслан

Можно, конечно. Почта info@it-simple.ru.
Только быстрого ответа не обещаю, анализ может затянуться )

Добрый день
Я 2013.01.23 18:17:14 высылал Вам свой файл на проверку, хочу поинтересоваться результатом. Если готов дайте знать, пожалуйста.

Виталий
2013.04.25 07:11:33
#cid60405

Ответить

Уважаемый Admin, помогите разобраться, пожалуйста (а то я совсем запутался):
у меня не срабатывает редирект:
ErrorDocument 404 /404.html (если включен RewriteEngine On)

Вопрос такой. Нужно ли вообще сообщать серверу об ошибке

если я в самом скрипте могу настроить страницу ошибок и сделать соответствующее перенаправление в mod_rewrite?
Заранее благодарен!

Виталий
2013.04.25 07:13:53
#cid60407

Ответить

пардон, PHP код вставил случайно. Под сообщением серверу подразумевалось:

header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");

Василий
2013.04.25 23:40:24
#cid60434

Ответить

Здравствуйте!

Говорят что о хороших людях вспоминают когда становится плохо и я, судя по моему присутствию здесь, не исключение :)

У меня проблема.
Проиндексировались страницы с некорректным url. И я так понимаю что их нужно перенаправить на постоянной основе на корректные страницы.

Описание проблемы (на примере).
На сайте "Общага" есть такие разделы как "Друзья" и "Кухня". В них есть материалы:
1. Общага/Друзья/категория/2-ФотоДруга1, Общага/Друзья/категория/51-1-ФотоДруга2;
2. Общага/Кухня/категория/900-ФотоКухни1, Общага/Кухня/категория/500-2-ФотоКухни1.
Так вот в выдаче появились страницы Общага/Кухня/категория/2-ФотоДруга1, Общага/Друзья/категория/900-ФотоКухни1 и т.д.

Вопрос.
1. Как заменить в url слово "Кухня" на "Друзья" или наоборот - слово "Друзья" на слово "Кухня"?
Дело осложняется тем, что этих ссылок около 500 и если исправлять ситуацию перечислением "с такого-то url перевести на такой-то url", то это, на мой взгляд, будет замедлять работу сайта.
2. Все 500 ссылок делятся на группы - их всего 10. Каждая группа содержит уникальный набор цифр, стоящий всегда после "категория/" и перед первым тире "-". Возможно есть способ задать условие: если ссылка содержит "Кухня" и уникальный набор цифр, то нужно поменять слово "Кухня" на "Друзья".

С уважением,
Василий.

2013.04.26 21:08:11
#cid60484

Ответить

#cid60365, Руслан

Добрый день

Добрый.

Я 2013.01.23 18:17:14 высылал [...]

— К чёрту подробности, какой год?

Сразу не ответил, а потом забыл, извиняй. Отправил ответ сейчас.

По факту понял, что в таком виде работать не готов. Теперь — только конкретные частные вопросы, только на сайте и без каких-либо гарантий ответа/помощи с моей стороны. И всё это при условии, что проблема не описана в заметке или ещё не обсуждалась в комментариях.

2013.04.26 21:30:29
#cid60485

Ответить

#cid60405, Виталий

Уважаемый Admin, помогите разобраться, пожалуйста (а то я совсем запутался):
у меня не срабатывает редирект:
ErrorDocument 404 /404.html (если включен RewriteEngine On)

Так и должно быть, ведь это не редирект. Это указание веб-серверу, какой файл надо выдать, если HTTP-запрос к веб-серверу окончился сообщением с кодом 404.

Вопрос такой. Нужно ли вообще сообщать серверу об ошибке

Это не в силах клиента — сообщить серверу об ошибке или нет :)
Сервер принимает решение самостоятельно, на основе сопутствующих признаков.

если я в самом скрипте могу настроить страницу ошибок и сделать соответствующее перенаправление в mod_rewrite?

Практически во всех движках все запросы к несуществующим файлам перенаправляются в точку входа движка (чаще всего index.php). Так что генерация страницы 404 тоже должна происходить силами движка. И чаще всего это эмуляция, а не реальная 404-ая ошибка (в логах сервера отразится, что сервер успешно загрузил пользователю страницу типа 404.php).

Заранее благодарен!

Пожалуйста.

2013.04.26 21:41:15
#cid60486

Ответить

#cid60407, Виталий

Под сообщением серверу подразумевалось:

header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");

Отвечаю по порядку, не сразу прочитал :)

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

2013.04.26 21:56:17
#cid60488

Ответить

#cid60434, Василий

Здравствуйте!

Добрый вечер.

Говорят что о хороших людях вспоминают когда становится плохо и я, судя по моему присутствию здесь, не исключение :)

В итоге, хорошие люди видят в окружающих только плохое ;)

Все 500 ссылок делятся на группы - их всего 10. Каждая группа содержит уникальный набор цифр, стоящий всегда после "категория/" и перед первым тире "-".

Для простоты будем называть "уникальный набор цифр" идентификаторами записей — чем они, скорее всего, и являются в БД. Судя про описанию, проблема вызвана недоработкой (или это фишка такая, хз) в движке. То есть, если урл заканчивается существующим ID с правильным именем страницы, то движку пох, какая группа прописана в урле.

Проблема вызвана движком, и решать её надо там же.

Как вариант — в скрипте для выдачи страниц проверять, соответствует ли в запрошенном урле ID группе. Если не соответствует — генерировать правильный урл (на основе ID) и делать на него 301-ое перенаправление.

Василий
2013.04.26 22:44:21
#cid60493

Ответить

Добрый вечер!

Движок Joomla 2.9. Сейчас ищу вариант как исправить, но ... всё это в процессе.
По этой причине, а ещё по той что я сам скрипты не пишу, а только учусь, можно решить проблему временно - через постоянное перенаправление на нужную страницу?

Василий
2013.04.26 22:51:15
#cid60494

Ответить

Очень конечно надеюсь что в новой версии Joomla будет устранён этот дефект, но надежда очень часто отворачивается в последний момент :) вместе с заветным алмазом :)
По-этому прошу помочь с перенаправлением.

2013.04.26 23:34:58
#cid60496

Ответить

#cid60493, Василий

можно решить проблему временно - через постоянное перенаправление на нужную страницу?

Гипотетически можно, конечно. Но по сложности это будет чуть проще, чем все странички пересохранить в html-виде с нужными именами.
Но пересохранить странички будет, по крайней мере, правильнее по сути.

#cid60494, Василий

Очень конечно надеюсь что в новой версии Joomla будет устранён этот дефект, но надежда очень часто отворачивается в последний момент :) вместе с заветным алмазом :)

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

Проще забить.

Василий
2013.04.26 23:56:20
#cid60500

Ответить

Гипотетически можно, конечно. Но по сложности это будет чуть проще, чем все странички пересохранить в html-виде с нужными именами.
Но пересохранить странички будет, по крайней мере, правильнее по сути.

Т.е. проще в .htaccess прописать руками для каждого url перенаправление?

Василий
2013.04.27 00:16:56
#cid60503

Ответить

Я знаю точные url: истинные и ложные.
Как лучше сделать перенаправление?

Вариант № 1.
RewriteCond %{QUERY_STRING} ^Общага/Кухня/категория/2-ФотоДруга1$ [NC]
RewriteRule ^$ Общага/Друзья/категория/2-ФотоДруга1/? [R=301,L]

Вариант № 2.
RewriteCond %{QUERY_STRING} .* /Кухня/категория/2-ФотоДруга1$ [NC]
RewriteRule .* /Друзья/категория/2-ФотоДруга1/? [R=301,L]

С уважением,
Василий

Василий
2013.04.28 01:01:08
#cid60557

Ответить

Ни один из вариантов не работает ...

Василий
2013.04.28 01:43:31
#cid60559

Ответить

Работает такой вариант
Redirect 301 /Кухня/категория/467-ФотоДруга http://mebel-kd.ru/Друзья/категория/467-ФотоДруга

2013.04.28 06:47:56
#cid60568

Ответить

#cid60500, Василий

Т.е. проще в .htaccess прописать руками для каждого url перенаправление?

Проще (с учётом перспективы) разобраться и сделать всё технически правильно.

#cid60503, Василий

Я знаю точные url: истинные и ложные.
Как лучше сделать перенаправление?

Завтра проиндексируются новые странички, и вследствие кривизны движка — проиндексируются таким же кривым образом.
Что делать будешь? Снова htaccess править?

Кстати, правила нерабочие. QUERY_STRING там вообще не при чём.

#cid60559, Василий

Работает такой вариант

Зачем тебе вообще движок, если ты каждую страницу собираешься лепить вручную?

Ещё раз: сделай как правильно, а не так, как тебе кажется "проще".

Василий
2013.04.28 16:19:05
#cid60585

Ответить

Не знаю как можно исправить данную ситуацию. Не силен в php.
Согласен что лечу следствие, а не причину.

С большим уважением, Василий.

Сергей
2013.05.01 00:08:53
#cid60814

Ответить

Как сделать, если к примеру у нас ссылка на пост может быть "обычной" и с приставкой комментариями, чтобы редиректило на соответсвующую страницу с коментами или без в зависимости от случая. Например:

RewriteCond %{REQUEST_URI} ^post/3158131(\#coment\d)?
RewriteRule .* $post/4542134(%1)? [R=301,NC,L]
Т.е. если ссылка с приставкой номера коментария что бы делался редирект на страницу с коментариями

Дмитрий
2013.05.01 15:29:50
#cid60871

Ответить

Всем доброе время суток!
Ребята прошу Вашей помощи! Суть вопроса такова. Яндекс индексирует у меня картинки как простые так и с водяным знаком. Те и те картинки хранятся в одной папке.

001.jpg - простая картинка без водяного знака
286-watermark.jpg - картинка с водяным знаком

Возможно запретить в .htaccess индексацию простых картинок?

Спасибо!

Сергей
2013.05.01 21:43:06
#cid60888

Ответить

Как сделать, если к примеру у нас ссылка на пост может быть "обычной" и с приставкой комментариями, чтобы редиректило на соответсвующую..
Вопрос решился.

2013.05.06 16:50:10
#cid61241

Ответить

#cid60888, Сергей

Вопрос решился.

Разобрался сам — напиши, как это сделать, чтобы могли и другие. Это признак хорошего тона.
Если приходишь за помощью, то и сам эту помощь оказывай.

2013.05.06 18:28:28
#cid61246

Ответить

#cid60871, Дмитрий

Водяные знаки на картинках — это зло.

Не надо уподобляться мудакам.

Дмитрий
2013.05.06 18:49:14
#cid61249

Ответить

#cid61246,

#cid60871, Дмитрий

Водяные знаки на картинках — это зло.

Не надо уподобляться мудакам.

Ну "мудакам" громко сказано :) Просто хочется отстаивать свою интеллектуальную собственность. Живу по принципу (Если нужно, то проси, а не воруй). + не очень хочется, чтоб по просторам интернета ходили фотографии именно моего товара без водяных знаков, т.к. купив по фото данный товар (не надлежащего качества) у другого человека, клиент может пустить дурной слух об этом товаре ссылаясь на данное фото, а другие люди увидев это фото у меня на сайте, попросту не будут покупать его у меня. Вот как то так :)

2013.05.06 21:53:33
#cid61259

Ответить

#cid61249, Дмитрий

Ну "мудакам" громко сказано :)

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

Если лого не работает для связи с автором, то зачем оно вообще?

"Чистая" картинка (без мусора из логотипов) в этой ситуации (когда всё равно невозможно докопаться до оригинала) всегда выигрывает.

Просто хочется отстаивать свою интеллектуальную собственность.

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

Ситуация, когда человек занимается фотографией профессионально, художественно, делает тысячи снимков ради одного Того Самого — другой случай, сейчас речь не об этом. Но там, кстати, и способы защиты другие: в общий доступ выкладывается фотка ухудшенного качества, а желающие могут прикупить её в полном размере.

Живу по принципу (Если нужно, то проси, а не воруй). + не очень хочется, чтоб по просторам интернета ходили фотографии именно моего товара без водяных знаков, т.к. купив по фото данный товар (не надлежащего качества) у другого человека, клиент может пустить дурной слух об этом товаре ссылаясь на данное фото, а другие люди увидев это фото у меня на сайте, попросту не будут покупать его у меня. Вот как то так :)

Смотри.

1) Если информация доступна для просмотра — значит, её всегда можно скачать. Незыблемый принцип электронной информации.
Можно слегка затруднить процесс для обычного пользователя, но более-менее подкованный человек сделает это без усилий. Нельзя сделать так, чтобы твои картинки были доступны без логотипа для добропорядочных посетителей и с логотипом для всех остальных.

2) Индексация настраивается в файле robots.txt, но его содержимое — это не жОсткая инструкция, а всего лишь "убедительная просьба" к поисковику.

3) Если информацию "для просмотра" на сайте всё равно можно скачать, то не нужно создавать искусственные технические ограничения. Во-первых, они не помогут. Во-вторых, на реализацию такой "защиты от самых маленьких" уходит масса времени и сил, которые можно потратить на более полезные занятия.

4) Если речь идёт не о самих фотокарточках, а об их содержимом (товаре), тем более нет нужды защищать сами фотокарточки.

Моё мнение: метод, который ты выбрал для борьбы с нечестными продавцами — не сработает.

Если всё-таки хочешь распространять фотки с логотипом — ставь его на ВСЕ фотографии. Сделай так, чтобы фотки без логотипа не были доступны по сети — физически удали их с сайта (поменяй на проштампованные). Ни одно другое ограничение не сработает.

Дмитрий
2013.05.07 17:22:11
#cid61333

Ответить

#cid61249, Дмитрий

#cid61246,

В принципе ты прав :) Если захотят и так стырят) Буду тратить время на более полезные вещи :) Спасибо за ответ)

Александр
2013.05.13 08:52:28
#cid61897

Ответить

Здравствуйте!
Подскажите пожалуйста начинающему вебмастеру.
Мне надо сделать перенаправление с адреса http://www.kkp-05.ru/privatizatsiya на адрес http://www.kkp-05.ru/privatizatsiya/privatizatsiya-zhilykh-pomeshchenij
Я прописал в файле .htaccess
Redirect 301 /privatizatsiya http://www.kkp-05.ru/privatizatsiya/privatizatsiya-zhilykh-pomeshchenij

но происходит зацикливание...подскажите пожалуйста, как это исправить...спасибо

2013.05.13 19:18:08
#cid61932

Ответить

#cid61897, Александр

но происходит зацикливание...

А каталог или файл "privatizatsiya-zhilykh-pomeshchenij" — существует? Или это "виртуальный" урл, который внутренним редиректом даётся на парсирование движку (это стандартное поведение), точка входа в который лежит в реальном каталоге "/privatizatsiya", с которого ты снова делаешь внешний редирект?

Александр
2013.05.14 09:47:24
#cid62006

Ответить

#cid61932,

#cid61897, Александр

А каталог или файл "privatizatsiya-zhilykh-pomeshchenij" — существует? Или это "виртуальный" урл, который внутренним редиректом даётся на парсирование движку (это стандартное поведение), точка входа в который лежит в реальном каталоге "/privatizatsiya", с которого ты снова делаешь внешний редирект?

Да, существует, это новая страница http://www.kkp-05.ru/privatizatsiya/privatizatsiya-zhilykh-pomeshchenij
которая была раньше доступна по адресу http://www.kkp-05.ru/privatizatsiya
и мне надо настроить редирект, потому что есть ссылки, которые идут на страницу http://www.kkp-05.ru/privatizatsiya
спасибо за ответ.

2013.05.14 17:14:21
#cid62036

Ответить

#cid62006, Александр

"http://www.kkp-05.ru/privatizatsiya/privatizatsiya-zhilykh-pomeshchenij" —
— это либо реальный, либо виртуальный урл. Одно из двух.

Реальным урл называется тогда, когда указанный путь ("privatizatsiya/privatizatsiya-zhilykh-pomeshchenij") существует на файловой системе сервера. При этом "privatizatsiya-zhilykh-pomeshchenij" — это либо каталог, либо файл без расширения (но так обычно не делают).

В противном случае урл обрабатывается движком (который на основе несуществующего пути генерирует соответствующую страницу, html-документ) и называется виртуальным.

В своём предыдущем комментарии, в последнем вопросе, я описал ситуацию, вследствие которой у тебя могут возникать бесконечные перенаправления.

Александр
2013.05.16 09:36:08
#cid62224

Ответить

#cid62036,

#cid62006, Александр

"http://www.kkp-05.ru/privatizatsiya/privatizatsiya-zhilykh-pomeshchenij" —
— это либо реальный, либо виртуальный урл. Одно из двух.

Реальным урл называется тогда, когда указанный путь ("privatizatsiya/privatizatsiya-zhilykh-pomeshchenij") существует на файловой системе сервера. При этом "privatizatsiya-zhilykh-pomeshchenij" — это либо каталог, либо файл без расширения (но так обычно не делают).

В противном случае урл обрабатывается движком (который на основе несуществующего пути генерирует соответствующую страницу, html-документ) и называется виртуальным.

В своём предыдущем комментарии, в последнем вопросе, я описал ситуацию, вследствие которой у тебя могут возникать бесконечные перенаправления.

Спасибо за ответ.
Не совсем понимаю о чём речь, опишу ситуацию.
1.Сайт на движке Джумла
2.Была создана в Джумле страница http://www.kkp-05.ru/privatizatsiya которая открывалась через боковое меню на сайте
3.Затем в боковое меню в пункт "Приватизация" добавились подпункты и у этой страницы сменился адрес на http://www.kkp-05.ru/privatizatsiya/privatizatsiya-zhilykh-pomeshchenij

imen
2013.05.22 13:31:31
#cid62860

Ответить

Отмечусь и я :)
Ты неправ. Категорически нельзя было опускать ссылку на _первичную_ документацию (хоть она и на буржуйском):
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
http://httpd.apache.org/docs/2.2/rewrite/

Да и третью сотню комментов надо закрыть :)

В ситуации, когда на хосте (адресе) больше DNS-имён (alias'ов), чем виртуальных хостов (или когда там запущены не только простые (HTTPS), но и защищённые (HTTPS) виртуальные хосты) практически полезно озаботиться задачей контроля доменных имён. Решать каковую я полагаю правильным не в .htaccess, но в конфигурационном файле сервера.

Допустим, есть два HTTP виртуальных хоста (www.mydomain.ru и local.mydomain.ru) и один защищённый (secure.mydomain.ru), также (дополним до общего случая) у хоста есть например DNS-alias ns.mydomain.ru.
Стартовая точка: никаких дополнительных настроек не проводилось.

Признак: запросы по URL'у http://secure.mydomain.ru (SSL выключен) фактически попадают на первый из HTTP-виртуальных хостов (например http://www.mydomain.ru).
Для решения _этой_ задачи (force https для доменного имени) mod_rewrite избыточен.
Задача решается созданием специального виртуального хоста:

ServerName secure.mydomain.ru
Redirect / https://secure.mydomain.ru/

Есть ли более изящные (и не завязанные на статический список доменных имён) способы перенаправления http-запросов на не имеющие соответственного виртуального хоста адреса по 404?

Вторая часть: фиксация _правильного_ (secure.mydomain.ru) доменного имени для защищённого виртуального хоста (ибо практически туда попадаютзапросы и на https://www.mydomain.ru и на https://local.mydomain.ru, с той поправкой, что последний во публичном DNS'е скорее всего должен отсутствовать).
httpd-ssl.conf:
...

...
#
#
RewriteEngine on
#
RewriteCond %{HTTPS} ^on$
RewriteCond %{HTTP_HOST} !^secure\.mydomain\.ru$
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/?(.*) https://secure.mydomain.ru/$1 [L,R,NE]
#

...

Но тут есть проблемка. Сертификат сервера издан под secure.mydomain.ru, и при обращении по имени [например] www.mydomain.ru браузер выдаёт закономерную ошибку сертификата (несоответствие доменного имени).
Нет ли более изящного решения?

Андрей
2013.05.23 13:33:23
#cid62963

Ответить

Добрый день
Подскажите этим правилом я закрою весь сайт от индексации этих роботов?
Order Allow,Deny
Allow from all
Deny from env=search_bot

SetEnvIfNoCase User-Agent "Googlebot" search_bot
SetEnvIfNoCase User-Agent "Yandex" search_bot
SetEnvIfNoCase User-Agent "Yahoo" search_bot

imen
2013.05.24 16:08:55
#cid63088

Ответить

А вот с нестандартными портами... ситуация печальнее.

Оффициальная дока http://httpd.apache.org/docs/trunk/rewrite/remapping.html выглядит странно (точнее решает задачу переброса на стандартный HTTP-порт.
В моей же ситуации (например в висящему на стандартном HTTPS-порту secure.mydomain.ru на том же сервере добавляется ещё повешеный на 3443-й порт admin.mydomain.ru; задача та же --- принудительная унификация доменных имён) оно не применимо.
Пробую писать:
#
RewriteEngine on
#
RewriteCond %{HTTPS} ^on$
RewriteCond %{HTTP_HOST} !^admin\.mydomain\.ru$
RewriteCond %{HTTP_HOST} !^$

RewriteRule ^/?(.*) https://admin.mydomain.ru:%{SERVER_PORT}/$1 [L,R,NE]
#

Формально правильно. Но браузер сообщает ошибку (сервер перенаправляет запрос таким образом, что тот никогда не завершится).
Это мой косяк или база, порождённая нестандартностью и редкостью требований?

Алексей
2013.05.28 19:16:40
#cid63515

Ответить

Ребята, подскажите где делаю ошибку?
Нужно ссылку http://site.com.ua/index.php/2013-05-15-27-29-04
переадресовать на http://site.com.ua/

Делаю запись:
RewriteCond %{HTTP_HOST} ^site\.com\.ua\/index\.php\/2013-05-15-27-29-04$ [NC]
RewriteRule ^http://site.com.ua/$ [R=301,L]
Не работает...

2013.05.28 22:33:54
#cid63533

Ответить

#cid63515, Алексей

Ребята, подскажите где делаю ошибку?

1) RewriteBase /

2) RewriteCond %{REQUEST_URI} ^index\.php\/2013-05-15-27-29-04\/?$ [NC]

3) RewriteRule .* / [R=301,L]

Качество сделанных ошибок говорит о том, что ты заметку прочитал через строчку (если вообще прочитал), а комментарии не читал совсем.

2013.05.28 22:39:10
#cid63534

Ответить

#cid62224, Александр

1.Сайт на движке Джумла
2.Была создана в Джумле страница http://www.kkp-05.ru/privatizatsiya которая открывалась через боковое меню на сайте
3.Затем в боковое меню в пункт "Приватизация" добавились подпункты и у этой страницы сменился адрес на http://www.kkp-05.ru/privatizatsiya/privatizatsiya-zhilykh-pomeshchenij

1. Я толком не знаю Джумлу.
2. Не имеет значения, как оно выглядит. Важно, как оно устроено внутри.
3. См.п. 2.

* В твоём случае надо сесть и кропотливо разбираться, как идут урлы и как они преобразуются на каждом шаге (запрос-htaccess-движок). Самое сложное будет разобраться с движком, и здесь я помочь ничем не могу.

2013.05.28 22:55:05
#cid63538

Ответить

#cid62860, imen

Отмечусь и я :)

Приве-е-ет! :)

Ты неправ. Категорически нельзя было опускать ссылку на _первичную_ документацию (хоть она и на буржуйском):

Тому, кто способен разобраться с первичной документацией, нахрен не нужна эта страничка. И уж тем более он сможет найти эту документацию сам.

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

Да и третью сотню комментов надо закрыть :)

Будем посмотреть. Вообще я не планировал бить комменты на страницы.

В ситуации, когда на хосте (адресе) больше DNS-имён (alias'ов), чем виртуальных хостов (или когда там запущены не только простые (HTTPS), но и защищённые (HTTPS) виртуальные хосты) практически полезно озаботиться задачей контроля доменных имён. Решать каковую я полагаю правильным не в .htaccess, но в конфигурационном файле сервера.

Это если у тебя есть туда доступ. На сторонних площадках проблема вируальных поддоменов отлично решается настройкой DNS, прописыванием htaccess и программированием скриптов.

Есть ли более изящные (и не завязанные на статический список доменных имён) способы перенаправления http-запросов на не имеющие соответственного виртуального хоста адреса по 404?

Честно — хз. Ранее не сталкивался, а специально разбираться лень.
Второго вопроса это тоже касается :)

2013.05.28 23:01:29
#cid63539

Ответить

#cid62963, Андрей

Добрый день
Подскажите этим правилом я закрою весь сайт от индексации этих роботов?
Order Allow,Deny
Allow from all
Deny from env=search_bot

SetEnvIfNoCase User-Agent "Googlebot" search_bot
SetEnvIfNoCase User-Agent "Yandex" search_bot
SetEnvIfNoCase User-Agent "Yahoo" search_bot

Сходу — не знаю. Проверять надо.

2013.05.28 23:04:15
#cid63540

Ответить

#cid63088, imen

А вот с нестандартными портами... ситуация печальнее.

Попробуй добавить RewriteCond, исключающий нестандартный %{SERVER_PORT} — может, тогда цикла не будет.

imen
2013.05.29 17:26:25
#cid63608

Ответить

#cid63540,

Попробуй добавить RewriteCond, исключающий нестандартный %{SERVER_PORT} — может, тогда цикла не будет.

Авотфиг!
Не в нём дело.

Более того, хотя оно (явное указание порта) и является, строго говоря, избыточным. Но согласно моим представлениям о Разумном, Добром и Вечном оно должно быть.
Практически фишка здесь в том, что Индеец до 2.2.24 включительно склонен интерпретировать нестандартный порт в качестве части строки значения HTTP_HOST (бага?).

Соответственно рабочим набором условий для вышеописанной задачи перенаправления будет:

RewriteEngine on
#
RewriteCond %{HTTPS} ^on$
RewriteCond %{HTTP_HOST} !^admin\.mydomain\.ru:3443$
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{SERVER_PORT} =3443

RewriteRule ^/?(.*) https://admin.mydomain.ru:%{SERVER_PORT}/$1 [L,R,NE]

Сергей
2013.06.06 00:23:20
#cid64323

Ответить

Пытаюсь проверить для примера редирект с index.php?lang=ru, ничего не происходит почему? Тещю на локалке на хостинге дописывал захожу тоже ничего..
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^(.*)\.php\?(.*)$ $1\.php [R=301,NC,L]

2013.06.06 01:38:16
#cid64330

Ответить

#cid64323, Сергей

Пытаюсь проверить для примера редирект с index.php?lang=ru, ничего не происходит почему? Тещю на локалке на хостинге дописывал захожу тоже ничего..

Убери "\?(.*)" из шаблона RewriteRule. Если я не ошибаюсь, запросная часть в выражение для проверки не входит.

И там же убери экраны из строки для замены. У тебя "$1\.php", а надо "$1.php". Экраны нужны только для шаблонов, а строка для замены — это не шаблон.

Михаил
2013.06.10 18:43:33
#cid64780

Ответить

Добрый день.
Не могу реализовать редирект.
На сайте есть страницы дубли:
http://сайт.ru/категория/страница
http://сайт.ru/сайт/категория/страница
Т.е. перед названием категории добавляется название папки в которой лежит сайт.

Перепробовал сотни примеров - не помагает. Например:

RewriteCond %{REQUEST_URI} ^/(.*)
RewriteRule ^сайт/(.*)$ http://сайт.ru/$1? [L,R=301]

При открытии страницы http://сайт.ru/сайт/категория/страница - урл не меняется.
А при открытии страницы вида http://сайт.ru/сайт/сайт/категория/страница - срабатывает редирект на http://сайт.ru/категория/страница

Подскажите, пожалуйста, как реализовать редирет, что бы срабатывал переход при открытии страниц вида http://сайт.ru/сайт/категория/страница

2013.06.10 20:16:59
#cid64789

Ответить

#cid64780, Михаил

Подскажите, пожалуйста, как реализовать редирет, что бы срабатывал переход при открытии страниц вида http://сайт.ru/сайт/категория/страница

Слитно.

А при таких проблемах как правило (чаще всего) в настройках движка достаточно указать, что файлы сайта расположены в каталоге "сайт/" относительно корня сайта "сайт.ru" на веб-сервере.

lounge
2013.06.30 19:59:28
#cid67146

Ответить

Добрый день!

Достался сайт с такой проблемой.
Есть страницы вида
/index.php?page=123

но в индексе гугла и яндекса попадаются также страницы вида
/?page=123 (без index.php!!!)

причем часто присутствуют и те и те, хотя это одно и тоже.

Подскажите, плиз, как сделать 301 редирект чтобы страницы второго вида перебрасывались на страницы первого.

Сергей
2013.06.30 21:28:53
#cid67152

Ответить

Спасибо огромное за статью!
Но я, все же, не могу справиться со своей задачей.
Заменить группу правил:
RewriteCond %{QUERY_STRING} ^firma_kond=11$
RewriteRule ^split_systems_daikin.php /split_systems_daikin.php? [R=301,L]
RewriteCond %{QUERY_STRING} ^firma_kond=11$
RewriteRule ^cassette_conditioners_daikin.php /cassette_conditioners_daikin.php? [R=301,L]
RewriteCond %{QUERY_STRING} ^firma_kond=11$
RewriteRule ^channel_conditioners_daikin.php /channel_conditioners_daikin.php? [R=301,L]

на одно с использованием регулярных выражений:
RewriteCond %{QUERY_STRING} ^firma_kond=11$
RewriteRule ^(.*).php?(.*)$ /$1.php? [R=301,L]

Подскажите, пожалуйста, в чем ошибка.

2013.07.02 11:09:28
#cid67287

Ответить

#cid67146, lounge

Добрый день!

Добрый.

Подскажите, плиз, как сделать 301 редирект чтобы страницы второго вида перебрасывались на страницы первого.

RewriteRule ^/$ index.php [R=301,L]

Типа того. Проверю и добавлю в заметку.

2013.07.02 11:14:44
#cid67288

Ответить

#cid67152, Сергей

Спасибо огромное за статью!

Пожалуйста :)

RewriteCond %{QUERY_STRING} ^firma_kond=11$
RewriteRule ^(.*).php?(.*)$ /$1.php? [R=301,L]

Подскажите, пожалуйста, в чем ошибка.

Если мне не изменяет память, в строке url для сравнения с шаблоном RewriteRule отсутствует запросная часть (%{QUERY_STRING}). Поэтому попробуй так:

RewriteRule ^(.*)$ $1? [R=301,L]

Дмитрий
2013.07.11 13:37:19
#cid68258

Ответить

Добрый день!
Уже целый день бьюсь с проблемой редиректа в .htaccess
Изменились алесы товаров в интернет магазине, по сути просто изменилась транскрипция русского слова с не правильной на правильную.
были: site.ru/magazin/xxx-top-xxx (ххх - название производителя, артикул и т.д.)
стали: site.ru/magazin/xxx-tip-xxx
Подскажите пожалуйста, как сделать редирект со страниц magazin/xxx-top-xxx на xxx-tip-xxx?

Александр
2013.07.16 00:02:54
#cid68657

Ответить

Доброго времени суток!
Очень простая и нужная статья, уже 4-5 дней висит у меня в Опере.
Только сейчас заметил комментарии и что добрый человек отвечает на вопросы. И решил свой задать, может ответы не только мне пригодятся.

1)
Подскажите как блокировать всех по ключевым словам(исключая некоторые IP)?
Например по слову function и login
Например ссылки:
site.ru\page45464\function#@fdsljl?3232
site.ru\category54\login&function#@fdsljl?3232
site.ru\function#@fdsljl?3232
site.ru\page45464\#@fdsljl?3232function
site.ru\page45464\#@fdsljl\?function=4343
Тоесть чтоб не пропускало пользователей тех, у кого в запросе есть ключевые слова. И не важно где, даже и с запросах GET(после знака ?) и вообще все возможные модификации.
Можете ли показать пример?

2)Еще одно. Нужно сделать так: не пропускать всех кто с методом POST, исключение если на страницы www.site.ru/contacts и для www.site.ru/main.html (тоесть если не на эти 2 страницы, то не пропускать всех), кроме 2 IP которым разрешено всё IP 127.0.0.1 и 127.0.0.2 и на любые страницы с POST.
Реализовано так:
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !=127.0.0.1
RewriteCond %{REMOTE_ADDR} !=127.0.0.2
RewriteRule ^ - [F,L]
Это работает как закрытие для всех кто с методом POST кроме 2х IP
НО надо еще добавить исключение в виде 2х страниц на сайте. Были попытки дописать:
RewriteCond %{REQUEST_URI} !/contacts
Но не работает.
Весь код:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !=127.0.0.1
RewriteCond %{REMOTE_ADDR} !=127.0.0.2
RewriteRule ^ - [F,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Очень надеюсь на быстрый ответ.

Владимир
2013.07.16 02:02:28
#cid68664

Ответить

Подскажите пожалуйста...
Делаю так

RewriteCond %{REQUEST_URI} !/catal/
RewriteRule ^(.*?)(.*?)/(.*)$ $1catal/$2?$3

НО мне нужно:
RewriteCond %{REQUEST_URI} !/catal/|/news/|/go/|/artic/|/event/...

Как бы этот RewriteCond %{REQUEST_URI} !/catalogue/... изменить на что то типа
RewriteCond %{REQUEST_URI} /catalogue/(.*)?/?(.*)?/?(.*)
То есть RewriteCond %{REQUEST_URI} /(только для ссылок которые вида /catal/one/ или /catal/one/two/ || /catal/one/two/three/)

2013.07.16 02:29:52
#cid68666

Ответить

#cid68258, Дмитрий

Добрый день!

Доброй ночи.

Подскажите пожалуйста, как сделать редирект со страниц magazin/xxx-top-xxx на xxx-tip-xxx?

RewriteRule ^(.*)/([^/]*)-top-([^/]*)/?$ ${1}/${2}-tip-${3} [R=301,L]

Примерно так. Пишу навскидку, без проверки.

2013.07.16 02:59:45
#cid68669

Ответить

#cid68657, Александр

Доброго времени суток!

Доброго.

Только сейчас заметил комментарии

:)))

1)
Подскажите как блокировать всех по ключевым словам(исключая некоторые IP)?

RewriteCond %{REQUEST_URI} plohoe_slovo_1|plohoe_slovo_2|... [NC]
RewriteCond %{REMOTE_ADDR} !=1.1.1.1
RewriteCond %{REMOTE_ADDR} !=2.2.2.2
RewriteCond %{REMOTE_ADDR} !=...
RewriteRule ^ - [F,L]

Типа того. Возможно, в первом RewriteCond шаблон надо взять в круглые скобки, но может и так будет работать, не уверен.
Разберусь — дополню заметку.

2)Еще одно. Нужно сделать так: не пропускать всех кто с методом POST, исключение если на страницы www.site.ru/contacts и для www.site.ru/main.html (тоесть если не на эти 2 страницы, то не пропускать всех), кроме 2 IP которым разрешено всё IP 127.0.0.1 и 127.0.0.2 и на любые страницы с POST.

Переформулируй задачу и всё станет намного проще.

Надо закрыть доступ для тех, кто:
1. Стучится методом POST
2. НЕ c привилегированных ip
3. НЕ на разрешённые страницы

Теперь можно оформлять в виде правил.

НО надо еще добавить исключение в виде 2х страниц на сайте. Были попытки дописать:
RewriteCond %{REQUEST_URI} !/contacts
Но не работает.

Попытки правильные. Где-то затесалась ошибка.

Очень надеюсь на быстрый ответ.

Быстро и бесплатно. Мне бы так всегда.

2013.07.16 03:07:54
#cid68670

Ответить

#cid68664, Владимир

Камрад, я ж не телепат. А по такому описанию задачи — ничего не понятно.

Александр
2013.07.16 19:28:25
#cid68749

Ответить

Спасибо за ответы, вы настоящий комрад :)
" Возможно, в первом RewriteCond шаблон надо взять в круглые скобки" - и так работает.
По 1 пункту еще вопросы, ко 2му еще не перешел.
1)
- Как сделать чтобы фильтр еще распространялся и на строку запроса. Например в GET : site.ru/?plohoe_slovo_1
- Как сделать чтобы было в правиле не просто IP а подсеть? Например: RewriteCond %{REMOTE_ADDR} !=1.1.1.1/20 - Так не работает. Или как-то указать диапазон IP от и до.

Александр
2013.07.16 19:42:38
#cid68752

Ответить

И еще вопрос, боты иногда долбят(один и тот же запрос по 3-5 раз в секунду) сайт и делают нагрузку, вот пример из лога:
POST / HTTP/1.0" 200 99631 "http://site.ru/category/banya/veniki/krutoi-venik" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.12
или такой:
POST / HTTP/1.0" 200 99631 "http://site.ru/konsultaciya-bani-free" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36

Как придумать такое правило, чтобы этого не было?
-------------------------------
И для примера, нормальные запросы пользователей:
POST /dobavit-otzyv-pro-bani HTTP/1.0" 200 427 "http://site.ru/dobavit-otzyv-pro-bani" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A551 Safari/8536.25
И еще:
POST /comments.php HTTP/1.0" 302 0 "http://site.ru/moskva-bani.html" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36
---------------------
Тут есть отличия, робот:
POST / HTTP/1.0"
человек:
POST /comments.php HTTP/1.0"

Как это использовать? Я немного не понимаю, почему если робот то только "/" без страницы какой либо, объясните если разбираетесь, пожалуйста.

Владимир
2013.07.16 20:41:22
#cid68755

Ответить

Мне нужно вот что:
Делаю на umi cms.
Если я делаю какой либо редирект через htaccess, то мне почему-то добавляется в адрес ссылки ?path=.%..&umi_authorization=.%..
в не зависимости, от того в начале файла или в конце в начале всех правил или нет...

Если пишу в htaccess только rewriterule (без редиректа, без [L], не Redirect permanent... ) и делаю редирект через кастомный макрос, то ?path=.%..&umi_authorization=.%.. не добавляется.

а мне нужно только убрать из ссылки часть.
То есть мне нужно, что бы в ссылке /catalogue/ оставалось /catalogue/ а вот в /catalogue/one/two/three/.. у всех вложений в каталоге убиралось /catalogue/ и /catalogue/one/two/three/ была /one/two/three
Реализовываю таким образом
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/catalogue/|/news/|/go/|/articles/|/events/|/stock/|/contacts/|/search/|/sitemap/|/ajax/|/webforms/|//
RewriteRule ^(.*?)(.*?)/(.*)$ $1catalogue/$2?$3

Но RewriteCond %{REQUEST_URI} !/catalogue/... не метод, т.к. нельзя же перечислять все остальные страницы, их херова туча...
RewriteCond %{REQUEST_URI} catalogue(.*)/ не работает

И если делать так, как я делаю выше, то на страницах /catalogue/... пагинация перестает работать.

Может быть подскажите что нибудь?

2013.07.16 21:02:34
#cid68763

Ответить

#cid68749, Александр

- Как сделать чтобы фильтр еще распространялся и на строку запроса. Например в GET : site.ru/?plohoe_slovo_1

В документации к Apache сказано, что в переменной "REQUEST_URI" лежит как раз весь адрес, включая запросную часть. Тесты это подтверждают. Читал, что mod_rewrite берёт серверные переменные из Apache. Но тесты показывают, что в "REQUEST_URI" для mod_rewrite запросная часть действительно отсутствует.

Почему так — не знаю. Пока не разобрался. Быстрое решение проблемы — добавить ещё один фильтр:

RewriteCond %{QUERY_STRING} plohoe_slovo_1|plohoe_slovo_2|... [NC]

- Как сделать чтобы было в правиле не просто IP а подсеть? Например: RewriteCond %{REMOTE_ADDR} !=1.1.1.1/20 - Так не работает. Или как-то указать диапазон IP от и до.

После знака "=" содержимое RewriteCond воспринимается как строка, а не шаблон. Не ставь знак равенства и вместо ip напиши шаблон, определяющий нужный диапазон адресов.

С маской, кратной байтам, будет просто. Например, если маска 24, то:

RewriteCond %{REMOTE_ADDR} !^1.1.1.\d+$

Как без геморроя задать маску 20 (1.1.1.1/20 — это адреса 1.1.0-15.0-255, третий октет от 0 до 15) — я не знаю.
С геммороем — по отдельности задать диапазон от 0 до 9 (\d) и добавить к нему диапазон от 10 до 15 (1[0-5]).

Вообще mod_rewrite — это скоростной способ первичной обработки урлов. Первичной.
Если нужны более гибкие и настраевыемые вещи, их проще реализовывать программным способам, скриптами сайта.

2013.07.16 21:34:02
#cid68766

Ответить

#cid68752, Александр

И еще вопрос, боты иногда долбят(один и тот же запрос по 3-5 раз в секунду) сайт и делают нагрузку, вот пример из лога:

Бывают ещё запросы из разряда "мы пришли в корень вашего сайта по ссылке с другого. Пусть ваш админ зайдёт к нам и сделает нам посещаемость".

Как придумать такое правило, чтобы этого не было?

Правилами никак. Ну, если говорить о ситуации в общем виде.
Долбёжку должен определить скрипт. И впоследствии, в течении какого-то времени, он же должен игнорировать подобные запросы.
А вот уже "игнорирование" можно реализовать с помощью .htaccess. Но тогда твой скрипт должен уметь грамотно его редактировать: при определении долбёжки записать правило для игнорирования, а минут через 10 стереть его.

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

Как это использовать?

Выше ты уже поставил запрет на POST-запрос в корень. Этого достаточно.

Я немного не понимаю, почему если робот то только "/" без страницы какой либо, объясните если разбираетесь, пожалуйста.

Обычно стандартные движки разбирают POST-запросы централизованно, все они приходят на стандартную точку входа, index.php.
Сайты настраиваются так, что "пустой" запрос пересылается на стандартную точку входа стандартного движка, тот же index.php.
Т.е. бот посылает такой запрос, чтобы в 99 случаях из 100 записать на сайт свой злоебучий спам.

2013.07.16 22:11:24
#cid68770

Ответить

#cid68755, Владимир

Нормальное объяснение проблемы поможет гораздо лучше просьб и "поторапливаний".

Делаю на umi cms.

Первый раз слышу. Особенностей не знаю.

Если я делаю какой либо редирект через htaccess, то мне почему-то добавляется в адрес ссылки ?path=.%..&umi_authorization=.%..
в не зависимости, от того в начале файла или в конце в начале всех правил или нет...

"Вне зависимости". Иногда надо "в независимости", но здесь не тот случай.

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

То есть мне нужно, что бы в ссылке /catalogue/ оставалось /catalogue/ а вот в /catalogue/one/two/three/.. у всех вложений в каталоге убиралось /catalogue/ и /catalogue/one/two/three/ была /one/two/three

Говоришь про /catalogue/, но дальше откуда ни возьмись появляются /catalogue/|/news/|/go/ и т.д. Понять, о чём речь — невозможно. Что такое /one/two/three/ — непонятно. Подкаталоги? В таком случае, как ты без перечисления всех возможных каталогов I уровня, от которых нужно избавиться, сможешь отличить часть, от которой избавляться не нужно — от того же /one/?

Реализовываю таким образом
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/catalogue/|/news/|/go/|/articles/|/events/|/stock/|/contacts/|/search/|/sitemap/|/ajax/|/webforms/|//
RewriteRule ^(.*?)(.*?)/(.*)$ $1catalogue/$2?$3

Море ошибок. Поэтому даже по правилам невозможно понять, чего ты хотел сделать.
Без необходимых основ ничего не получится, а их у тебя нет. Советую почитать теорию, я как раз добавил несколько новых ссылок в заметку.

Без обид.

Александр
2013.07.17 01:44:13
#cid68797

Ответить

Спасибо еще раз. Извините если что. Я вас помучаю вопросами, вы единственный толковый профи, которого встречал в инете по этому вопросу.
"быстрое решение проблемы — добавить ещё один фильтр"
Сделал так:
RewriteCond %{REQUEST_URI} plohoe_slovo_1|plohoe_slovo_2|... [NC]
RewriteCond %{QUERY_STRING} plohoe_slovo_1|plohoe_slovo_2|... [NC]
RewriteCond %{REMOTE_ADDR} !=1.1.1.1
RewriteCond %{REMOTE_ADDR} !=2.2.2.2
RewriteRule ^ - [F,L]
Не сработало и отменяло работу 1 пунка, но по отдельности 2 блока когда сделал, то работает 1 и 2 пункт.

--------------------------------------------------------
"С геммороем — по отдельности задать диапазон от 0 до 9 (\d) и добавить к нему диапазон от 10 до 15 (1[0-5])."
Если честно не очень понял, как это будет выглядеть в итоге. На самом деле у меня не 20, а 18(маска)
Напишите, если не сложно как будет выглядеть этот IP c маской 18(xxx.xxx.0.0 - xxx.xxx.63.255):
ххх.ххх.0.0/18
Если сложно с 18, то можно и 16(xxx.xxx.0.0 - xxx.xxx.255.255) - хуже конечно(пропустим еще несколько государств), но все же лучше будет чем весь мир. :)

"Если нужны более гибкие и настраевыемые вещи, их проще реализовывать программным способам, скриптами сайта"
У меня вордпресс и я не знаю как это реализовать, кое-как пытаюсь с помощью вас с htaccess, а програмный способ для меня вообще будет гремучий лес.

--------------------------------------------------
"Выше ты уже поставил запрет на POST-запрос в корень. Этого достаточно."
Из-за неработы
RewriteCond %{REQUEST_URI} !/contacts
Не использую пока этот метод везде, так как блокирует всех комментраторов, тк они используют через .php фаил метод POST. Плюс обратная связь.
Еще не разобрался в чем дело, но буду экспериментировать, может надо как-то по другому путь указывать не /contacts а полный, пока не знаю, хотя
RewriteBase /
как я понял, обрезает всю сроку до самой страницы тоесть надо писать не site.ru/contacts, а просто /contacts
Фаил htaccess находится в папке с сайтом, а сайтов несколько, может в этом дело, может как-то не так все же интерпретируется путь...

Но я пока не об этом, а о:
"Сайты настраиваются так, что "пустой" запрос пересылается на стандартную точку входа стандартного движка, тот же index.php."
Может как-то написать правило:
Если "пустой" запрос POST и приходит на "стандартную точку входа стандартного движка, тот же index.php" - тогда Блокировать эти IP.
Можно ли это реализовать?

Владимир
2013.07.17 02:36:51
#cid68799

Ответить

Мне нужно ссылки вида www.site.ru/catalogue/business/b1/b2 привести к виду www.site.ru/business/b1/b2
Если я делаю так:
RewriteRule ^(.*)business/(.*)$ $1catalogue/business?$2
То ссылки приводятся нормально, но мне нужно business сделать маркером, имхо таких, как business очень много.
Предыдущий вариант как раз работает, но выполняется не только для catalogue, если не поставить RewriteCond %{REQUEST_URI} !/catalogue/
А вот |/news/|/articles/ - это что бы на них это правило тоже не действовало.

Владимир
2013.07.17 02:44:05
#cid68800

Ответить

Точнее, после RewriteCond %{REQUEST_URI} !/catalogue/ след. правило выберет под каталоги catalogue/, но корень (catalogue)не возьмет

Александр
2013.07.17 14:05:03
#cid68840

Ответить

Александр2013.07.17 01:44:13
С маской разобрался, подсеть \18:
!^127.0.(6[0-3]|[0-5]?\d).\d+$
Теперь я гуру по цифрам в регулярных выражениях :))
------------
Остается с POST разобраться

2013.07.17 19:12:05
#cid68880

Ответить

#cid68797, Александр

RewriteCond %{REQUEST_URI} plohoe_slovo_1|plohoe_slovo_2|... [NC]
RewriteCond %{QUERY_STRING} plohoe_slovo_1|plohoe_slovo_2|... [NC]

RewriteCond %{REQUEST_URI} plohoe_slovo_1|plohoe_slovo_2|... [NC,OR]
RewriteCond %{QUERY_STRING} plohoe_slovo_1|plohoe_slovo_2|... [NC]
...

OR! Иначе правило следит за тем, чтобы plohoe_slovo было и в пути к файлу, и в запросной части урла.

У меня вордпресс и я не знаю как это реализовать, кое-как пытаюсь с помощью вас с htaccess, а програмный способ для меня вообще будет гремучий лес.

"Гремучий лес" — это что-то новое, надо запомнить :)

Из-за неработы
RewriteCond %{REQUEST_URI} !/contacts
Не использую пока этот метод везде, так как блокирует всех комментраторов, тк они используют через .php фаил метод POST. Плюс обратная связь.
Еще не разобрался в чем дело

Возможно потому, что адрес "/contacts" перенаправляется в тот же index.php, который парсит урл и собирает страницу для выдачи. Вордпресс так устроен.

RewriteBase /
как я понял, обрезает всю сроку до самой страницы тоесть надо писать не site.ru/contacts, а просто /contacts

Нет. Когда ты обращаешься на веб-сервер с запросом "http://site.ru/contacts", он смотрит где у него внутри лежит сайт "site.ru" — к примеру, это каталог "/home/user/www/site.ru/" — и ищет в этом подкаталоге каталог "contacts/".
"RewriteBase /" обрезает не урл, а путь к каталогу на сервере. То есть, оперирует не с "http://site.ru/contacts", а с "/home/user/www/site.ru/contacts".

Фаил htaccess находится в папке с сайтом, а сайтов несколько, может в этом дело, может как-то не так все же интерпретируется путь...

Один сайт — один каталог. Если несколько сайтов ссылаются на один каталог, они называются алиасами.

"Сайты настраиваются так, что "пустой" запрос пересылается на стандартную точку входа стандартного движка, тот же index.php."
Может как-то написать правило:
Если "пустой" запрос POST и приходит на "стандартную точку входа стандартного движка, тот же index.php" - тогда Блокировать эти IP.
Можно ли это реализовать?

Фишка в том, что POST-запрос с "/contacts" приходит тоже на index.php :)

Копни в сторону %{HTTP_REFERRER}. Попробуй фильтровать запросы, проверяя не куда, а откуда они приходят.

2013.07.17 19:12:41
#cid68881

Ответить

#cid68840, Александр

С маской разобрался, подсеть \18:
!^127.0.(6[0-3]|[0-5]?\d).\d+$
Теперь я гуру по цифрам в регулярных выражениях :))

Шаришь! :)
Но точки забыл заэкранировать. И предваряющий ноль в III октете лишний.

!^127\.0\.(6[0-3]|[1-5]?\d)\.\d+$

2013.07.17 19:28:28
#cid68883

Ответить

#cid68799, Владимир

Мне нужно ссылки вида www.site.ru/catalogue/business/b1/b2 привести к виду www.site.ru/business/b1/b2

RewriteRule ^/catalogue/(.*)$ $1

RewriteRule ^(.*)business/(.*)$ $1catalogue/business?$2
То ссылки приводятся нормально

Это странно, потому что правило не делает заявленной вещи.
Адрес "www.site.ru/catalogue/business/b1/b2" будет приведён к "www.site.ru/catalogue/catalogue/business?b1/b2"

RewriteRule [шаблон] [подстановка] [флаги]
[шаблон] — часть урла, обозначающая путь на сервере. Типа "/home/user/www/catalogue/business/b1/b2"
[подстановка] — то, во что мы этот путь переделываем
[флаги] — поведение при изменении урла и после него

но мне нужно business сделать маркером, имхо таких, как business очень много.

То, что я и говорил: без перечисления возможных вариантов всё равно не обойтись. Ну, насколько я понял задачу.

Александр
2013.07.17 23:17:57
#cid68904

Ответить

"И предваряющий ноль в III октете лишний."
[1-5]?\d - точно, ноль там ни к чему.
"Но точки забыл заэкранировать."
НО:
".(точка) Заменяет собой любой произвольный символ, но только один. Кроме символа конца строки."
Получается любой символ это точка тоже.
То есть у меня и так все работало, но с вашими замечаниями будет более правильней.
А 0-255 это:
(25[0-5]|2[0-4]\d|[01]?\d\d?) - но как-то длинновато и думаю ни к чему. Но так написал, чтоб типа все правильно было. :)
--------------------------------------

До [NC,OR] уже сам в обед додумался и все в одном блоке уже.
-------------------------------

!/contacts - не работало, потому что слеш лишний тут !contacts, но все равно именно contacts не работает, там плагин стоит. Получается что на странице contacts есть форма плагина и эта форма обрабатывает данные каким-то файлом, но немогу вычислить какой именно, так как в логах его не вижу.
Зато нашел фаил обработки .php для коментов и вот его указал без слэша и теперь коменты все в исключении вместе с определенными IP.

А вот что делать с плагином обратной связи не знаю пока.
И еще contacts - это не каталог и не подкаталог, это название страницы только без концовки .html или .php - может в этом загвоздка?

"Фишка в том, что POST-запрос с "/contacts" приходит тоже на index.php" - вот это не понял. Ведь с коментами я разобрался и обратывает фаил определенный коменты.php а не index.php.

2013.07.18 00:11:21
#cid68907

Ответить

#cid68904, Александр

".(точка) Заменяет собой любой произвольный символ, но только один. Кроме символа конца строки."
Получается любой символ это точка тоже.

Да, поэтому многие забивают. Но получается по сути неправильно, хотя и работает.
В некоторых случаях (но не в этом!) приводит к трудновычисляемым ошибкам. Собственно, поэтому и обратил внимание.

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

Так точно. И ноль можно было оставить, просто случай с предстоящим нулём никогда бы не сработал.

А 0-255 это:
(25[0-5]|2[0-4]\d|[01]?\d\d?) - но как-то длинновато и думаю ни к чему.

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

И еще contacts - это не каталог и не подкаталог, это название страницы только без концовки .html или .php - может в этом загвоздка?

Это виртуальный каталог из виртуального урла. Обрабатывается движком.

"Фишка в том, что POST-запрос с "/contacts" приходит тоже на index.php" - вот это не понял.

Виртуальный каталог.

Александр
2013.07.19 15:50:59
#cid69052

Ответить

Добрый день.
Подскажите, как имитировать такой запрос как у бота:

POST / HTTP/1.0" 200 99631 "http://site.ru/category/banya/veniki/krutoi-venik" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.12
или такой:
POST / HTTP/1.0" 200 99631 "http://site.ru/konsultaciya-bani-free" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36
---
Я пробовал делать штмл фаил с содержимым:

Получалось в логах:
POST /dobavit-otzyv-pro-bani HTTP/1.0" 200 427 "http://site.ru/dobavit-otzyv-pro-bani" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A551 Safari/8536.25
--
Как сделать чтобы в итоге в логах показало???:
POST / HTTP/1.0" .......
а не
Получалось в логах(имеется ввиду после POST / чтобы было пусто):
POST /dobavit-otzyv-pro-bani HTTP/1.0" ....
--
Что у робота прописано в action="ТУТ" ?

2013.07.19 18:59:54
#cid69067

Ответить

#cid69052, Александр

Добрый день.
Подскажите, как имитировать такой запрос как у бота:

В линухах — консольная программа lwp-request или просто POST. Делает любые запросы с любыми внутренними данными
В виндах — не знаю.

Я пробовал делать штмл фаил с содержимым:

Теги рубятся. В правилах об этом написано.

maz
2013.07.31 08:30:29
#cid69982

Ответить

Подскажите как решить:
сайт на битрикс.
есть папка с документами site.ru/pdf в ней лежали пдф файлы.
их накопилось много - создал поддомен на другом хостинге pdf.site.ru/ и перенес около 500 документов туда
как теперь сделать переадресацию чтобы пользователю при запросе site.ru/pdf/test.pdf открывался пдф документ по адресу pdf.site.ru/test.pdf ?

2013.08.01 12:38:50
#cid70061

Ответить

#cid69982, maz

как теперь сделать переадресацию чтобы пользователю при запросе site.ru/pdf/test.pdf открывался пдф документ по адресу pdf.site.ru/test.pdf ?

RewriteRule ^/pdf/(.*)$ http://pdf.site.ru/$1 [NC,R=301,L]

Кирилл
2013.08.09 03:51:54
#cid70568

Ответить

Помогите плиззззз

Надо вот это:
www.kinoposting.ru/users/?su_cid=24

Превратить вот в это:
www.kinoposting.ru/users/24

Очень нужно, Заранее благодарю

СГ
2013.08.09 15:11:12
#cid70591

Ответить

Здравствуйте!
Помогите решить 2 проблемы:
1. Нормальный адрес выглядит так: /index.php?option=com_content&view=article&id=108&Itemid=44&lang=ru
Но Яндекс вдобавок проиндексировал страницы типа /index.php?option=com_content&view=article&id=108&Itemid=&lang=ru (с пустым параметром Itemid)
как можно вместо пустого подставлять, к примеру, Itemid=10?

2. если в URL входит фраза select (типа SQL-инъекции), нужно, чтобы открывалась главная

Сергей
2013.08.12 19:34:07
#cid70858

Ответить

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

И ещё, может подскажете с htaccess, делаю редирект для Wordpress, если пишу

Redirect 301 "откуда" "куда" то все ок если заменяю
Redirect 301 на RewriteRule то при редиректе добавляет лишние символы (на кирилический урл)
К примеру в первом варианте редиректило на http://domen.ru/%D1%81%D0%B0%D0%B4-%D0%BE%D0%B3%D0%BE%D1%80%D0%BE%D0%B4 (что собственно нужно), а при втором варианте получается

http://domen.ru/%25D11%25D0%25B0%25D0%25B4-%25D0%25BE%25D0%25B3%25D0%25BE%25D10%25D0%25BE%25D0%25B4

добавляются цифры.... непонятно почему
RewriteRule список-всех-категорий/сад http://domen.ru/%D1%81%D0%B0%D0%B4-%D0%BE%D0%B3%D0%BE%D1%80%D0%BE%D0%B4 [L,R=301] а редиректит на http://domen.ru/%25D11%25D0%25B0%25D0%25B4-%25D0%25BE%25D0%25B3%25D0%25BE%25D10%25D0%25BE%25D0%25B4

Виталий
2013.08.19 17:43:00
#cid71372

Ответить

Подскажите пожалуйста как запретить в .htaccess обработку url содержащих слова sleep, BENCHMARK
Не могу написать регулярное выражение, пробовал по разному. Вот этот вариант кажется наиболее правильным, но не работает:

RewriteRule ^(.*)(sleep|BENCHMARK)(.*)$ /default/ [F]

Евгений
2013.08.21 07:19:18
#cid71502

Ответить

Здравствуйте.
После изменения меню сайта изменились URL. Сделал вот такой редирект, как пример:
Redirect 301 /direct-current/theory/232-ways-of-improvement-of-switching.html http://www.electromechanics.ru/home/direct-current/theory/232-ways-of-improvement-of-switching.html

Redirect 301 /direct-current/theory/453-generators-of-parallel-excitement.html http://www.electromechanics.ru/home/direct-current/theory/453-generators-of-parallel-excitement.html

Разделов не сильно много, а вот ссылок многовато, поэтому хотелось бы редирект выполнить шаблоном хотя бы для каждого отдельного раздела. Помогите пожалуйста.

Евгений
2013.08.24 10:00:59
#cid71752

Ответить

Здравствуйте, еще раз.
Пробовал вто такой вариант делать RewriteRule ^transformers/(.*)/(.*)$ /home/transformers/$1/$2 [R=301,L] он не работает.

Евгений
2013.08.24 10:04:51
#cid71753

Ответить

Вернее вот такой RewriteRule ^direct-current/(.*)/(.*)$ /home/direct-current/$1/$2 [R=301,L], если смотреть на предыдущий вопрос.

Стас
2013.08.28 21:42:17
#cid72050

Ответить

Доброго времени суток!

Подскажите как можно реализовать изменение Url с site.com/?lang=ru на site.com/ru
Просто такого решения выше я че-то не нашел, а в кодировании htaccess я не силен. ((

Заранее спасибо за помощь!

2013.08.29 01:42:21
#cid72061

Ответить

#cid70568, Кирилл

#cid72050, Стас

У вас сходная проблема. Она уже разбиралась в комментариях.

2013.08.29 02:05:08
#cid72063

Ответить

#cid70591, СГ

Здравствуйте!
Помогите решить 2 проблемы:
1. Нормальный адрес выглядит так: /index.php?option=com_content&view=article&id=108&Itemid=44&lang=ru
Но Яндекс вдобавок проиндексировал страницы типа /index.php?option=com_content&view=article&id=108&Itemid=&lang=ru (с пустым параметром Itemid)

Это проблема движка. Проблемы движка надо решать редактированием движка. Иначе — костыли. Костыли ни к чему хорошему не приводят.

как можно вместо пустого подставлять, к примеру, Itemid=10?

if ( $_GET['Itemid']==="" ) { ... }

2. если в URL входит фраза select (типа SQL-инъекции), нужно, чтобы открывалась главная

Было в комментариях.

2013.08.29 02:18:32
#cid72064

Ответить

#cid70858, Сергей

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

Настроить ФС на веб-сервере, чтобы она была регистронезависимой.
Или предельно правильно задавать все имена, чтобы не было разночтений.
Как иначе — не знаю, сходу ничего в голову больше не приходит.

Redirect 301 "откуда" "куда" то все ок если заменяю
Redirect 301 на RewriteRule то при редиректе добавляет лишние символы (на кирилический урл)

Адреса на кириллице — зло (и патриотизм тут неуместен).

«%25» — это код символа «%», т.е. у тебя произошло двойное кодирование урла. Почему — не знаю.

2013.08.29 02:19:32
#cid72065

Ответить

#cid71372, Виталий

Подскажите пожалуйста как запретить в .htaccess обработку url содержащих слова sleep, BENCHMARK

Подробно разбиралось в комментариях.

2013.08.29 02:31:43
#cid72066

Ответить

#cid71502, Евгений

Здравствуйте.
После изменения меню сайта изменились URL. Сделал вот такой редирект, как пример:
Redirect 301 /direct-current/theory/232-ways-of-improvement-of-switching.html http://www.electromechanics.ru/home/direct-current/theory/232-ways-of-improvement-of-switching.html

Redirect 301 /direct-current/theory/453-generators-of-parallel-excitement.html http://www.electromechanics.ru/home/direct-current/theory/453-generators-of-parallel-excitement.html

Разделов не сильно много, а вот ссылок многовато, поэтому хотелось бы редирект выполнить шаблоном хотя бы для каждого отдельного раздела. Помогите пожалуйста.

Попробуй так:

RewriteRule ^(.*)$ /direct-current/$1 [R=301,L]

Если требуется перенаправлять не все урлы, а только определённого типа, то надо усложнить шаблон — добавить проверочные метки. Типа того:

RewriteRule ^(theory/.*\.html)$ /direct-current/$1 [R=301,L]

Стас
2013.08.30 14:45:05
#cid72186

Ответить

#cid72061,

#cid70568, Кирилл

#cid72050, Стас

У вас сходная проблема. Она уже разбиралась в комментариях.

честно, пересмотрел все перед тем как написать свой вопрос. даже попробовал применить то что нашел. но, к сожалению, не пошло ((

у меня вообще немного другая проблема:
у меня сайт на wordpress и он двуязычный. на главной странице русской версии есть постраничная навигация навигация и ссылка на последующие страницы такая: site.com/page/2?fp_type=news (вторая страница), site.com/page/3?fp_type=news (третья стр) и так далее.
а англ версии навигация почему-то формируется вот так: site.com/?lang=en%2Fpage%2F2&fp_type=news (вторая страница), site.com/?lang=en%2Fpage%2F3&fp_type=news (третья страница) и соответственно ведет никуда (404 ошибка).
поэтому я вначале и хотел добиться убрать ?lang=en и я не могу почему "/" стал отображаться кодом в URL.
можно как-то решить этот вопрос с помощью htaccess?
Буду премного благодарен!

Arty
2013.09.10 19:23:46
#cid73061

Ответить

Добрый день! такая проблема никак не найду решение.
Имеются страницы которые открываются по измененным адресам с помощью Htaccess
Вот адрес измененного URL http://site.ru/proekty/all/
нужно получить значение переменной "Номера страницы" если элементов много, в адресной строке я получаю
http://site.ru/proekty/all/?page=2

Нужно получить переменную "page" для обработки страницы, использовал $_GET['page']? но что то на нее не реагирует.

в файле Htaccess:

RewriteEngine On
RewriteRule ^proekty/([a-zA-Z0-9_-]+)/ proekty_all.php?tip_pr=$1

Что нужно добавить чтобы еще и работать с переменными после?

Заранее спасибо!

Василий
2013.09.10 22:36:20
#cid73073

Ответить

Здравствуйте!

Я вернулся =)

Подскажите, как правильно настроить (я уже просто под вечер не могу сообразить): изменились url сайта и нужно все страницы принадлежащих одной категории перенаправлять на постоянной основе на новый url. Думаю сделать так:
RewriteEngine On )уже есть в начале файла)

#перенаправляем все страницы входящие в http://site.ru/bobr/category
#на новый адрес http://site.ru/dom/category/new

RewriteCond %{QUERY_STRING} ^bobr/category$
RewriteRule dom/category/new [L,R=301]

2013.09.11 23:32:07
#cid73165

Ответить

#cid72186, Стас

Как видоизменять урлы — описано в заметке и комментариях.
Как избавляться от запросной части урла (то, что после знака «?») — описано в заметке и комментариях.

у меня вообще немного другая проблема:

Преобразование спецсимволов урла в коды — это нормально. Но подобные ситуации решаются настройкой веб-сервера или перепрограммированием движка, что к теме заметки не имеет отношения.

2013.09.11 23:40:44
#cid73167

Ответить

#cid73061, Arty

1. Часть глобальных переменных веб-сервера доступны модулю mod_rewrite.
2. В процессе работы этого модуля серверные переменные могут измениться.
3. Но серверные скрипты работают исключительно с глобальными переменными веб-сервера.

Что нужно добавить чтобы еще и работать с переменными после?

Ничего не надо добавлять. $_GET должен работать. Ищи ошибку.

Василий
2013.09.12 11:36:48
#cid73209

Ответить

Здравствуйте!

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

2013.09.12 14:44:03
#cid73218

Ответить

#cid73073, Василий

Здравствуйте!

Я вернулся =)

Приве-е-ет!
:)

RewriteRule dom/category/new [L,R=301]

А где шаблон, который меняешь?

#cid73209, Василий

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

не понимаю сути

Вот он, корень проблемы.

Василий
2013.09.12 19:25:58
#cid73233

Ответить

Эммм ... шаблон?
Я понимаю что я глупо прошу помочь без осмысливания самой сути проблемы ... вот мой вариант редиректа (один из :))

RewriteRule ^(.*)$ http://mebel-kd.ru/$1 [R=301,L]

Василий
2013.09.12 19:28:53
#cid73235

Ответить

Вот совсем уже не то делаю! Вот что нужно было прикрепить:

# 1 вариант
RewriteRule ^bobr/category(.*)$ /dom/category/new [L,R=301]

# 2 вариант
RewriteCond %{QUERY_STRING} ^bobr/category$
RewriteRule dom/category/new [L,R=301]

Василий
2013.09.13 13:46:28
#cid73292

Ответить

надоело выдумывать адреса и примеры :)
Вот старая страница: http://mebel-kd.ru/info/23-napolniteli-elegiya-km
Вот новая страничка: http://mebel-kd.ru/info/poleznaya-informatsiya/item/materiali-ispolzuemie-v-izgotovlenii-korpusnoy-mebeli

Как я перенаправляю
RewriteCond %{QUERY_STRING} ^info/[0-9]+\-{1}.* [NC]
RewriteRule ^$ info/? [R=301,L]

Верно?

Василий
2013.09.13 21:53:40
#cid73315

Ответить

Злобный Админ! Пожалуйста, обратите внимание на меня :) Потом на два дня пропаду ... на работе :)

Василий
2013.09.13 22:52:17
#cid73317

Ответить

Так работает, но может что я не учёл важного, посмотрите пожалуйста:
RewriteRule ^info/[0-9]+\-{1}.* http://mebel-kd.ru/info/poleznaya-informatsiya? [R=301,L]

Стас
2013.09.14 19:53:26
#cid73397

Ответить

#cid73165,

#cid72186, Стас

Как видоизменять урлы — описано в заметке и комментариях.
Как избавляться от запросной части урла (то, что после знака «?») — описано в заметке и комментариях.

Преобразование спецсимволов урла в коды — это нормально. Но подобные ситуации решаются настройкой веб-сервера или перепрограммированием движка, что к теме заметки не имеет отношения.

спасибо большое!
моя ошибка, что не до конца рассмотрел заметку. исправлюсь ))

Василий
2013.09.14 22:24:16
#cid73412

Ответить

Злобный Админ! Вы меня игнорируете? :)

2013.09.19 16:44:22
#cid73783

Ответить

#cid73233, Василий

RewriteRule ^(.*)$ http://mebel-kd.ru/$1 [R=301,L]

Это простой редирект на новое имя сайта. Не то, о чём говорилось ранее.

#cid73235, Василий

RewriteRule ^bobr/category(.*)$ /dom/category/new [L,R=301]

Странный шаблон. Зачем "category"? Зачем группировка круглыми скобками, если эта группа не используется в подстановке?

RewriteRule dom/category/new [L,R=301]

Ответил выше. Повторяю: здесь шаблон вообще пропущен, правило нерабочее.

#cid73292, Василий

надоело выдумывать адреса и примеры :)
Вот старая страница: http://mebel-kd.ru/info/23-napolniteli-elegiya-km
Вот новая страничка: http://mebel-kd.ru/info/poleznaya-informatsiya/item/materiali-ispolzuemie-v-izgotovlenii-korpusnoy-mebeli

Как я перенаправляю
RewriteCond %{QUERY_STRING} ^info/[0-9]+\-{1}.* [NC]
RewriteRule ^$ info/? [R=301,L]

Верно?

Нет.

#cid73315, Василий

Злобный Админ! Пожалуйста, обратите внимание на меня :) Потом на два дня пропаду ... на работе :)

За то время, что ты выпрашиваешь верное решение — мог бы уже десять раз сам разобраться. Окунись в литературу, посмотри примеры, сделай сам, это будет полезнее для всех. Не становись очередным дилетантом, который не хочет ничему учиться и "срубает" бабло, решая свои проблемы за чужой счёт.

#cid73317, Василий

Так работает, но может что я не учёл важного, посмотрите пожалуйста:
RewriteRule ^info/[0-9]+\-{1}.* http://mebel-kd.ru/info/poleznaya-informatsiya? [R=301,L]

Очень странный шаблон. Можно сильно упростить.

#cid73412, Василий

Злобный Админ! Вы меня игнорируете? :)

Нет. Я не сижу на сайте постоянно, отвечаю по мере возможности.

Василий
2013.09.25 19:29:04
#cid74270

Ответить

Разобрался сам, но получаются странные шаблоны =)
Вы на меня не обижайтесь, у меня просто было сложное время (надеюсь это время скоро закончится).
У меня вот сейчас не получается сделать постоянный редирект 301:
страница неверная: http://mebel-kd.ru/?catid=0&id=1
страница верная: http://mebel-kd.ru/pravila-prodazhi

Делаю правило: RewriteRule ^\?catid=0&id=1? http://mebel-kd.ru/pravila-prodazhi? [R=301,L]

Не работает. А почему? :)

Никита
2013.10.07 00:15:16
#cid75214

Ответить

У меня тоже небольшая проблема с файлом .htaccess

Я передал в строку браузера адрес и хочу "превратить" из сайт.ru/anekdoty-cat.php?link=anekdoty-pro-zhivotnyh в сайт.ru/anekdoty-pro-zhivotnyh но при добавлении этого условия в файл у меня сайт "ложится" - пишет "состояние перенаправления".

Условие для этого преобразования выглядит следующим образом:

RewriteRule ^(.*)$ anekdoty-cat.php?link=$1 [L]

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

RewriteRule ^anekdot/(.*)$ anekdoty-post.php?id=$1 [L]

Рабочее содержимое файла .htaccess выглядит следующим образом:

order allow,deny
deny from all

RewriteEngine on
RewriteCond %{ENV:REDIRECT_RWR} ^yes$
RewriteRule .* - [L]

RewriteCond %{QUERY_STRING} ^utm_source
RewriteRule ^.*$ http://%{HTTP_HOST}/$0? [R=301,L,E=RWR:yes]

RewriteCond %{HTTP_HOST} ^www.сайт.ru$ [NC]
RewriteRule ^(.*)$ http://сайт.ru/$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://сайт.ru/$1 [R=301,L]

Options +FollowSymlinks -MultiViews

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^anekdoty$ anekdoty.php [L]
RewriteRule ^anekdot/(.*)$ anekdoty-post.php?id=$1 [L]
RewriteRule ^anekdoty/date/(.*)$ anekdoty-date.php?date=$1 [L]

RewriteRule ^interesnye-fakty/(.*)$ post.php?id=$1 [L]
RewriteRule ^interesnye-fakty$ interesnye-fakty.php [L]

ErrorDocument 404 http://сайт.ru/error404.php
ErrorDocument 403 http://сайт.ru/error403.php

Когда в него добавляю условие преобразования RewriteRule ^(.*)$ anekdoty-cat.php?link=$1 [L] сайт не отвечает. Пожалуйста, подскажите в чём дело, может какой-то дополнительный модуль нужен вроде "MultiViews" или ещё что-то?

Алексей
2013.10.08 22:01:07
#cid75375

Ответить

Привет "Злобный Админ". Подскажи пожалуйста, как можно реализовать следующее посредством переадресации в .htaccess
Ранее на сайте были разделы мой-сайт.ру/natria и мой-сайт.ру/bremani
Теперь я переместил эти два раздела в один общий раздел мой-сайт.ру/продукция/ (т.е. получилось мой-сайт.ру/продукция/natria и мой-сайт.ру/продукция/bremani)
Как мне настроить 301 редирект с проиндексированных страниц в разделах мой-сайт.ру/natria и мой-сайт.ру/bremani на эти же страницы доступные теперь по адресу мой-сайт.ру/продукция/natria и мой-сайт.ру/продукция/bremani.
Заранее благодарен за помощь!

2013.10.08 22:29:57
#cid75377

Ответить

#cid74270, Василий

Разобрался сам, но получаются странные шаблоны =)
Вы на меня не обижайтесь, у меня просто было сложное время (надеюсь это время скоро закончится).
У меня вот сейчас не получается сделать постоянный редирект 301:
страница неверная: http://mebel-kd.ru/?catid=0&id=1
страница верная: http://mebel-kd.ru/pravila-prodazhi

Делаю правило: RewriteRule ^\?catid=0&id=1? http://mebel-kd.ru/pravila-prodazhi? [R=301,L]

Не работает. А почему? :)

В RewriteRule идёт урл без запросной части. С шаблоном сравнивается не полный урл, а только его часть, которая до знака вопроса.

Говорилось раньше, в комментариях.

2013.10.08 22:36:29
#cid75378

Ответить

#cid75214, Никита

Я передал в строку браузера адрес и хочу "превратить" из сайт.ru/anekdoty-cat.php?link=anekdoty-pro-zhivotnyh в сайт.ru/anekdoty-pro-zhivotnyh но при добавлении этого условия в файл у меня сайт "ложится" - пишет "состояние перенаправления".

Условие для этого преобразования выглядит следующим образом:

RewriteRule ^(.*)$ anekdoty-cat.php?link=$1 [L]

Под это преобразование попадут ВСЕ урлы. Вдобавок, оно преобразует вторую ссылку в первую, а не как написано.

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

RewriteRule ^anekdot/(.*)$ anekdoty-post.php?id=$1 [L]

А под это преобразование попадают только те урлы, которые начинаются с "anekdot/".

И внимание на группировку — что передаётся в QUERY_STRING первым, а что вторым преобразованием.

Когда в него добавляю условие преобразования RewriteRule ^(.*)$ anekdoty-cat.php?link=$1 [L] сайт не отвечает. Пожалуйста, подскажите в чём дело, может какой-то дополнительный модуль нужен вроде "MultiViews" или ещё что-то?

Правило неправильное.
Чтобы понять, что происходит на веб-сервере, надо смотреть логи веб-сервера.

2013.10.08 22:37:12
#cid75379

Ответить

#cid75375, Алексей

Скучно. Было в комментариях.

Помогите
2013.10.08 23:30:02
#cid75383

Ответить

Помогите, пожалуйста!

Есть адреса
site.ru/crash/rubrika1/rubrika2/rubrika3/chtoto?type=video и все адреса подобного рода нужно отправлять на 1 страницу... (то есть определено и известно 1)crash 2)?type=video)

Помогите
2013.10.08 23:31:14
#cid75384

Ответить

Так не работает RewriteRule ^crash/(.*)/(.*)/(.*)/(.*)$ /stranica [L,R=301]

2013.10.09 18:43:17
#cid75506

Ответить

#cid75383, Помогите

Есть адреса
site.ru/crash/rubrika1/rubrika2/rubrika3/chtoto?type=video и все адреса подобного рода нужно отправлять на 1 страницу... (то есть определено и известно 1)crash 2)?type=video)

Так и делай:
1. Проверяешь, что QUERY_STRING содержит "type=video" (RewriteCond).
2. Для адресов, начинающихся с "/crash" делаешь перенаправление (шаблон RewriteRule).

Евгения
2013.10.10 09:22:20
#cid75599

Ответить

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

2013.10.10 17:44:40
#cid75649

Ответить

#cid75599, Евгения

Некоторые движки сайтов требуют, чтобы в .htaccess были определённые правила. Если эти правила удалить, движок перестанет работать.

Что с ни такое и как это можно исправить?

Прочитай свой же комментарий, но чужими глазами: представь, что ты понятия не имеешь, о чём идёт речь. Как ответить на поставленный вопрос? Я не знаю.

Евгения
2013.10.13 18:30:14
#cid75973

Ответить

Спасибо, я уже разобралась, перезагрузка компьютера вернула все на свои места, не нужно было так паниковать..:)

imen
2013.10.13 20:07:10
#cid75980

Ответить

Спасибо, я уже разобралась, перезагрузка компьютера вернула все на свои места

Никак денвер?

Помогите
2013.10.15 16:58:44
#cid76171

Ответить

#cid75506,

#cid75383, Помогите

Так и делай:
1. Проверяешь, что QUERY_STRING содержит "type=video" (RewriteCond).
2. Для адресов, начинающихся с "/crash" делаешь перенаправление (шаблон RewriteRule).

Всё равно не могу разобраться... для адресов содержащих crash..

RewriteRule ^crash/(.*)/(.*)/(.*)/(.*)$ /stranica [L,R=301]

такое правило не работает... мне бы правило самое простое, вроде если есть в начале (именно в начале crash), а дальше что угодно то переадресация на страницу с 301 переадресацией

Помогите
2013.10.15 17:11:33
#cid76173

Ответить

Если делаю так RedirectMatch 301 ^/crash/.* /stranica то переадресовыывает на /stranica?type=video

Павел
2013.10.15 18:54:09
#cid76179

Ответить

Здравствуйте, почитал все комментарии но может просмотрел
Суть проблемы делаю IFRAME приложение вконтакте, при переходе в приложении вконтакте посылает очень длинный запрос на сервер вида http://www.site.ru/vkontakte?api_url=много много букв=, на сайте у меня просто создан раздел под дизайн вконтакте и по идее он должен выдать ему раздел http://www.site.ru/vkontakte с последующей иерархией, но сервер возвращает ему 403, можно ли как то это обойти при помощи htacsess, может видоизменить запрос обрезать его фактически мне просто нужен iframe раздела. Прошу помочь разобраться. Пробовал вывести сайт с другого хостинга все ОК.

Серый
2013.10.16 18:52:49
#cid76300

Ответить

Вопрос... Есть урлы вида 1) site.ru/dir1/per1/per2/per3 и урлы вида 2) site.ru/dir1/per1/per2 И вот мне надо сохранить урлы второго вида (чтобы не происходила ни какая переадресация), но переадресовать урлы первого вида, изменив dir1 на dir3, а также в урлах первого вида per1, per2, per3 нужно изменить регистр на нижний...

2013.10.24 11:07:25
#cid77058

Ответить

#cid75973, Евгения

Спасибо, я уже разобралась, перезагрузка компьютера вернула все на свои места, не нужно было так паниковать..:)

:)

#cid76171, Помогите

Читай заметку и комментарии. В них всё уже написано, многократно и со всех сторон.
Ну, или смени ник на "Сделайте всё за меня".

#cid76179, Павел

Суть проблемы делаю IFRAME приложение вконтакте

IFRAME — это просто область, в которую грузится стрница по заданному урлу. Урл проходит обработку на том сервере, с которого он грузится. С приложениями вконтакта никогда не работал, поэтому ничего больше сказать не могу.

#cid76300, Серый

Вопрос... Есть урлы вида 1) site.ru/dir1/per1/per2/per3 и урлы вида 2) site.ru/dir1/per1/per2 И вот мне надо сохранить урлы второго вида (чтобы не происходила ни какая переадресация), но переадресовать урлы первого вида, изменив dir1 на dir3, а также в урлах первого вида per1, per2, per3 нужно изменить регистр на нижний...

Не пойму суть проблемы. Всё задано, осталось написать одно правило с двумя уточняющими фильтрами.
Или надо, чтобы это сделал я?

Deni
2013.10.28 21:13:48
#cid77374

Ответить

Здравствуйте.

Помогите пожалуйста разобраться. Читаю уже второй день эту страницу и никак не могу понять как сделать следующее.

Есть адрес: http://site.ru/codes/poll/main_poll.php (реальный).
Как сделать редирект на http://site.ru/ если в адресе присутствует /codes/

Пробовал использовать RewriteCond %{QUERY_STRING}, но потом понял, что она работает, только там где присутствует в адресе знак ? (если я правильно понял), а в моем случаи этого знака нет.
Вообщем если не сложно подскажите как написать шаблон, что бы если присутствует /codes/, происходило перенаправление.

Deni
2013.10.29 19:11:34
#cid77439

Ответить

Методом проб и благодаря вашей разжеванной теме, за которую, выражаю вам ОГРОМНУЮ благодарность, допер сделать так:
RewriteRule ^(codes|cat|option)/(.+)$ - [G]
Работает! Выдает 410 ошибку сервера, но у меня возник вопрос (может вы в курсе), хорошо ли это с точки зрения СЕО. Мне кажется, что 410 в случае если адреса надо запретить навсегда лучше 404 и 301 редиректа. Как вы думаете?

2013.10.29 20:02:11
#cid77445

Ответить

#cid77439, Deni

RewriteRule ^(codes|cat|option)/(.+)$ - [G]

Моё почтение! Разобрался самостоятельно меньше чем за сутки и выдал на-гора практически эталонное решение. Все бы так. Без шуток.

но у меня возник вопрос (может вы в курсе), хорошо ли это с точки зрения СЕО. Мне кажется, что 410 в случае если адреса надо запретить навсегда лучше 404 и 301 редиректа. Как вы думаете?

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

Если страница была, но теперь её нет и не будет — надо выдавать сообщение (код состояния HTTP) 410.
Если страницы никогда и не было — 404.
А если страница осталась, но теперь доступна по другому адресу — делать на этот новый адрес перенаправление с возвратом кода 301 (301-й редирект).

Когда сайт работает по стандартам — это всегда идёт ему в плюс, в том числе и с точки зрения поисковых систем.

Deni
2013.10.29 21:07:27
#cid77452

Ответить

А подскажите пожалуйста.
Есть такой адрес http://сайт.ру/index.php?option=com_virtuemart&page=shop.browse&category_id=123&Itemid=11

Мне скажем надо отдавать тоже 410 ответ если в адресе присутствует option.
Делаю так:
RewriteCond %{QUERY_STRING} ^option(.*)$ [NC]
RewriteRule .* /index.php?option$1 - [G]
Не работает.
Еще пробывал так:
RewriteCond %{QUERY_STRING} option [NC]
RewriteCond %{PHP_SELF} ^/index.php$ [NC]
RewriteRule (.*) index.php - [G]
Тоже не прошло.

Подозреваю, что надо использовать RewriteBase /, но я, если правильно понял, используя это правило оно начинает распространятся на все ниже стоящие правила. Верно?
У меня ниже есть еще разные правила которые заданны в движке по умолчанию. Если я воспользуюсь RewriteBase /, то после аннулировать ее действие нельзя? Или просто стоит прописать одну из выше приведенных конструкций в самом низу файла .htaccess вместе с RewriteBase /?
А так же могли бы вы мне подсказать какая из конструкций верная и верны ли они вообще?

Еще на счет 404 ошибки. Я так понял файл обработчика задается вот этой строкой ErrorDocument 404 /site.ru/templ/error.php, но у меня почему-то не работает?

2013.10.30 02:48:34
#cid77484

Ответить

#cid77452, Deni

Хотел ещё в прошлом ответе написать, но думал, что ты разобрался. С другой стороны, никогда не поздно прояснить ситуацию.

Стандартные урлы выглядят следующим образом (разделители выделены, необязательные параметры в квадратных скобках):

протокол://[имя[:пароль]@]сайт[:порт]/путь[?запрос][#якорь]

То же самое без отвлекающих скобок:

протокол://имя:пароль@сайт:порт/путь?запрос#якорь

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

Остаются сайт, путь и запрос, которые чаще всего и используются в .htaccess.

Ещё раз, стандартный урл в упрощённом виде

http://сайт/путь?запрос

С сайтом, я думаю, всё понятно. Используется редко, ложИтся в переменную %{HTTP_HOST}.
С запросом тоже всё более-менее ясно. Он кладётся в переменную %{QUERY_STRING} и предназначен для обработки из скриптов.
Теперь путь.

Допустим, наш сайт лежит на сервере в каталоге "/var/www/mysite" (для виндузятников "C:\www\mysite"). Когда мы делаем запрос к веб-серверу (например, "http://my.site/index.php"), тот начинает оперировать с полными путями к реальному файлу ("/var/www/mysite/index.php" или "C:\www\mysite\index.php" у виндузятников). Этот полный путь начинает фигурировать в серверных переменных.
Такое поведение нам совсем-совсем не нужно, поэтому инструкцией "RewriteBase /" мы обрезаем начало абсолютного пути до относительного "index.php".
И теперь он совпадает с путём в урле.

Заданный в урле путь может не существовать на файловой системе, в этом случае он называется виртуальным. Виртуальный путь обычно передаётся на обработку реальному скрипту на сервере (перенаправление делается из .htaccess). Если не передаётся — вызывает 404 код, файл-то не существует.

Есть такой адрес http://сайт.ру/index.php?option=com_virtuemart&page=shop.browse&category_id=123&Itemid=11

http://%{HTTP_HOST}/%{REQUEST_URI}?%{QUERY_STRING}

Это при условии, что задействован "RewriteBase /".

И обращаю особое внимание:
1) %{REQUEST_URI} из .htaccess НЕ содержит запросную часть, запрос урла.
2) В RewtiteRule шаблон сравнивается именно с этим %{REQUEST_URI}, без запросной части.

Подозреваю, что надо использовать RewriteBase /, но я, если правильно понял, используя это правило оно начинает распространятся на все ниже стоящие правила. Верно?

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

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

У меня ниже есть еще разные правила которые заданны в движке по умолчанию. Если я воспользуюсь RewriteBase /, то после аннулировать ее действие нельзя? Или просто стоит прописать одну из выше приведенных конструкций в самом низу файла .htaccess вместе с RewriteBase /?

Как правило, все стандартные движки используют или подразумевают использование "RewriteBase /"

Еще на счет 404 ошибки. Я так понял файл обработчика задается вот этой строкой ErrorDocument 404 /site.ru/templ/error.php, но у меня почему-то не работает?

Стандартные движки с помощью ".htaccess" перенаправляют все запросы на себя, даже ошибочные (!), и обрабатывают ошибки сами. Потому что они, как правило, работают с виртуальными путями в урлах. В этом случае инструкция "ErrorDocument 404 ..." никогда не сработает.

Deni
2013.11.01 14:09:18
#cid77709

Ответить

Спасибо за подробный предыдущий коммент. Давно хотел разобраться с регулярками, да вот только нормального специалиста по ним найти не удавалось. Сидел на разных форумах, так там "знатоки" были, которые в теме чуть более моего разбирались. В итоге вместо решения вопросов и нормальных объяснений все превращалось в: Что? Где? Когда?

Теперь по поводу вашего коммента. Вы пишете, что "RewriteBase /" стоит использовать, однако в той же joomla это правило идет до основных инструкций ЧПУ и оно закомментированно. Не в курсе почему? Если я его раскомменнтирую - все работать будет?

Могли бы вы мне помочь прояснить еще одну ситуацию. Я так понимаю, что если директория или файл, к которому идет обращение расположен на сервере и к нему обращается скрипт, так же расположенный на сервере то IP, с которого будет идти обращение. соответствует IP сервера на котором все это происходит. Соответственно IP сервера равен домену который прикреплен к этому IP. Возможно ли сделать так, чтобы при обращении к директории, скажем в том же правиле

RewriteRule ^(codes|cat|option)/(.+)$ - [G],

если обращение идет с самого сервера, на котором это все лежит, то оно бы не блокировалось? Если же к тем же директориям обращается любой другой клеит, то ему выдавалась бы скажем 410 ошибка?
Пытаюсь cделать так:
RewriteCond %{HTTP_HOST} ^domain\.ru$ [NC]
RewriteRule ^(codes|cat|option)/(.+)$ http://domain.ru/$1/$2 - [G]
Это правило может сработать по сценарию, что я выше описал?

Заранее спасибо.

2013.11.01 18:24:40
#cid77723

Ответить

#cid77709, Deni

Вы пишете, что "RewriteBase /" стоит использовать, однако в той же joomla это правило идет до основных инструкций ЧПУ и оно закомментированно. Не в курсе почему? Если я его раскомменнтирую - все работать будет?

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

Я так понимаю, что если директория или файл, к которому идет обращение расположен на сервере и к нему обращается скрипт, так же расположенный на сервере то IP, с которого будет идти обращение. соответствует IP сервера на котором все это происходит. Соответственно IP сервера равен домену который прикреплен к этому IP.

Не так.

При обращении клиента сервер получает HTTP-запрос и ряд служебных данных, которые складываются в суперглобальный массив переменных $_SERVER. Этот массив доступен из скриптов на веб-сервере, которые его и используют. Как бы внутренние скрипты не взаимодействовали друг с другом, в рамках одного запроса массив $_SERVER не переинициализируется.

если обращение идет с самого сервера, на котором это все лежит, то оно бы не блокировалось?

В некоторых случаях, для решения определённого класса задач, можно инициировать HTTP-запрос из скрипта. То есть, скрипт сам сделает HTTP-запрос и получит на него ответ.

Такой запрос пойдёт по стандартной цепочке обращения к веб-серверу. То есть, он придёт на сервер "снаружи", как от обычного клиента, и в его рамках создадутся все необходимые серверные переменные и отработают все заданные скрипты.

Такие запросы можно отделять разными способами, начиная от IP (адрес сервера, REMOTE_ADDR) и заканчивая своей записью в HTTP_USER_AGENT.

toshiba
2013.11.20 10:46:54
#cid79586

Ответить

Здравствуйте.
У меня есть правило

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^start=(\d+)(\d)$
RewriteRule (.*) /$1/page/%1? [L,R=310]

которое работает. Но надо, чтобы оно работало без R=310, то есть чтобы URI сохранялся полностью (для сохранения ссылок sape при смене системы управления). Если просто убрать R=310, то правило не работает. Подскажите, пожалуйста, как это можно исправить.

Руслан
2013.11.25 13:16:31
#cid80258

Ответить

Добрый день.
Подскажите, у меня все страницы которые заканчиваются на .php выдают ошибку:
500 - Представление не найдено [name, type, prefix]: article, php, contentView
и строка заканчивается на 404.php вместо файл.php
Я подозреваю, что проблема в файле .htaccess, но что именно править я не знаю.

2013.12.10 08:23:25
#cid82528

Ответить

#cid79586, toshiba

Зачем в фильтре RewriteCond группировка, если она нигде не используется? И зачем особым образом выделять последнюю цифру в значении "start"?

По теме — должно работать. Если не работает, то простого ответа на вопрос "почему" — нету. Надо копать.

2013.12.10 08:25:31
#cid82529

Ответить

#cid80258, Руслан

Не знаю.

Похоже на финты движка, но легко могу ошибаться.

Виктория
2013.12.11 14:38:04
#cid82661

Ответить

Здравствуйте.

Помогите разобраться с такой задачей:
статьи на сайте доступны по следующим ссылкам: site.ru/items/razdel_name&about=statia_name
необходимо сделать чтобы статьи были доступны по: site.ru/items/razdel_name/statia_name

Прописала правила:
RewriteRule ^items/(.*)&about=(.*) items/$1/$2 [R=301,L]
RewriteRule ^items/(.+)/(.+)$ items/$1&about=$2 [L]

которые по отдельности работают, а вместе по понятным причинам приводят к зацикливанию. Подскажите как быть?

2013.12.11 16:42:18
#cid82667

Ответить

#cid82661, Виктория

Прописала правила:
RewriteRule ^items/(.*)&about=(.*) items/$1/$2 [R=301,L]
RewriteRule ^items/(.+)/(.+)$ items/$1&about=$2 [L]

которые по отдельности работают, а вместе по понятным причинам приводят к зацикливанию. Подскажите как быть?

Поменять их местами.

Виктория
2013.12.11 16:52:37
#cid82668

Ответить

Не помогает.

Виктория
2013.12.12 14:47:05
#cid82760

Ответить

Поставлю вопрос иначе. Если просто прописать редирект
RewriteRule ^items/(.+)/(.+)$ items/$1&about=$2 [L]
чтобы статьи были доступны по адресу site.ru/items/razdel_name/statia_name.
это работает. но возникает вопрос: ведь если мы введем старый адрес с &about= , то он тоже работает, получаются дубли страниц? или будет достаточно в robots.txt прописать запрет на индексацию старых урл? или как-то иначе надо выходить из этой ситуации?

2013.12.14 07:38:32
#cid82873

Ответить

#cid82760, Виктория

Поставлю вопрос иначе. Если просто прописать редирект
RewriteRule ^items/(.+)/(.+)$ items/$1&about=$2 [L]
чтобы статьи были доступны по адресу site.ru/items/razdel_name/statia_name.
это работает. но возникает вопрос: ведь если мы введем старый адрес с &about= , то он тоже работает, получаются дубли страниц? или будет достаточно в robots.txt прописать запрет на индексацию старых урл? или как-то иначе надо выходить из этой ситуации?

— Доктор, когда я так делаю, у меня болит...
— А вы так не делайте.

Чтобы решить проблему полностью и правильно, надо переделать движок так, чтобы он обрабатывал исключительно новый тип ссылок, а в htaccess поставить 301-ое перенаправление со старого типа на новый.

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

В том, что страницы сайта останутся доступными и по старым адресам, лично я не вижу ничего криминального. Такая проблема возникла не у тебя первой, а поисковики знают о ней и подавно. То есть, для поисковиков не будет большим криминалом, если одна страница доступна по нескольким адресам в пределах сайта. В этом случае внутренний ранг страницы в поисковике не "дробится" по адресам, а объединяется под одним из этих адресов. Единственное, что поисковик может взять для объединения старый тип адреса, но это может произойти и при жёсткой (как ты хочешь) смене типа.

Юрий
2013.12.14 14:48:10
#cid82900

Ответить

Подскажите пожалуйста, как сделать редирект 410 (gone) всех страниц, в url которых входит слово "kliver-sd55"?
Спасибо

2013.12.15 14:45:36
#cid82984

Ответить

#cid82900, Юрий

Подскажите пожалуйста, как сделать редирект 410 (gone) всех страниц, в url которых входит слово "kliver-sd55"?
Спасибо

В комментариях всё есть.

Konstantin
2014.02.02 15:33:57
#cid86071

Ответить

Подскажите, пожалуйста, как написать 301 редирект с mysite.com/kategoria/ID-material на mysite.com/kategoria/material и с mysite.com/kategoria/material/index.php на mysite.com/kategoria/material?

анастасия
2014.02.04 17:00:30
#cid86189

Ответить

Помогите пожалуйста настроить редирект со стр. с абракатаброй /?fsdfsdfwefwfwefwf на /(главную).

Валера
2014.02.07 09:12:42
#cid86348

Ответить

Всем привет.

Настя, тебе наверное нада бы вот как-то так сделать. Но я не уверен, потому как сам пока "безрукий" :)

ErrorDocument 404 /404.php

И вопрос к специалистам.
Как можно сделать редирект на www и без www для необходимых мне доменов на мультисайтинге?
Т.е. есть группа доменов 3го уровня и один 2го уровня.
Для второго хотелось бы сделать с www. А для 3го - без www. Собственно проблема не в составлении правила редиректа, а в вариативности. Т.е. в определении условия. Когда стучатся на www.sub.domain.ru - передавать значение редиректа на sub.domain.ru и т.д. (для имен 3го уровня), а для domain.ru - редиректить на www.domain.ru.

Все мои попытки - это танцы с бубном и перебор вариантов, потрачено куча времени...

Может кто подскажет как реализовать такое?

Валера
2014.02.07 09:13:22
#cid86349

Ответить

зы. Для Анастасии.
вместо 404.php наверное нада бы поставить index.html

Валера
2014.02.07 09:15:45
#cid86350

Ответить

ErrorDocument 404 /

инна
2014.02.11 22:58:05
#cid86575

Ответить

Добрый день! Помогите пожалуйста сделать 301 Redirect для wp
Cсылки:

1. http://mysite.com/?pod=443&id=1442 http://mysite.com/lunnyiy-kalendar-2013/
2. http://mysite.com/chelovek_i_medicina.php http://mysite.com/?pod=44&id=188
3. http://mysite.com/?pod=503&id=1413 http://mysite.com/lunnyiy-kalendar/215-2/luna-bez-kursa-2014/

webinvestor
2014.02.19 20:18:25
#cid86984

Ответить

Добрый день, всезнающий админ. Помогите, пожалуйста.
Есть страницы типа www.site.com/avto/mercedes-prokat...... Нужно сделать, чтобы при попытке ввода в адресную строку выражения www.site.com/mercedes-prokat...... (без промежуточного каталога avto) выдавало ошибку 404 или редирект на страницу с каталогом avto.

Примечание: каталог avto - постоянная величина, mercedes-prokat - динамическая.

Не оставьте в печали...

2014.02.20 05:06:49
#cid87000

Ответить

#cid86348, Валера

Как можно сделать редирект на www и без www для необходимых мне доменов на мультисайтинге?
Т.е. есть группа доменов 3го уровня и один 2го уровня.
Для второго хотелось бы сделать с www. А для 3го - без www. Собственно проблема не в составлении правила редиректа, а в вариативности. Т.е. в определении условия. Когда стучатся на www.sub.domain.ru - передавать значение редиректа на sub.domain.ru и т.д. (для имен 3го уровня), а для domain.ru - редиректить на www.domain.ru.

"www" — это тоже имя.

Например, "domain.ru" — домен 2-го уровня, а "www.domain.ru" — 3-го, как и "sub.domain.ru". А "www.sub.domain.ru" — домен 4-го уровня.

Главное это понять, дальше всё просто.

P.S. Спасибо за ответы другим участникам. А то я тут в одно лицо всё разгребаю )
Тем не менее — см. ниже.

2014.02.20 05:09:35
#cid87001

Ответить

#cid86189, анастасия

Помогите пожалуйста настроить редирект со стр. с абракатаброй /?fsdfsdfwefwfwefwf на /(главную).

Проверяй наличие абракадабры в переменной QUERY_STRING. Если есть — делай редирект с отсечением запросной части урла. Решение было в комментах.

2014.02.20 05:16:44
#cid87002

Ответить

#cid86071, Konstantin

#cid86575, инна

Было в комментах.

2014.02.20 05:23:01
#cid87003

Ответить

#cid86984, webinvestor

Добрый день, всезнающий админ. Помогите, пожалуйста.
Есть страницы типа www.site.com/avto/mercedes-prokat...... Нужно сделать, чтобы при попытке ввода в адресную строку выражения www.site.com/mercedes-prokat...... (без промежуточного каталога avto) выдавало ошибку 404 или редирект на страницу с каталогом avto.

Примечание: каталог avto - постоянная величина, mercedes-prokat - динамическая.

Не оставьте в печали...

Подозреваю, помимо каталога "avto/" в корне сайта есть ещё и другие каталоги, типа "moto/", "velo/" и т.д. Ну, иначе его существование ничем не обосновано, правда?
Так вот, при таких раскладах из .htaccess невозможно определить, что раздел "mercedes-prokat" принадлежит именно "avto/", а не другим каталогам.
То есть, такую задачу надо решать на уровне движка. Там для решения есть инструменты. В .htaccess таких инструментов нет.

Макс
2014.03.03 15:33:41
#cid87756

Ответить

Доброго времени суток.

Проблема возникла после переезда на новый хостинг.

например:
так грузится — http://www.site.ru/catalog/waterproofing/peneplag.html
так не грузится — http://www.site.ru/catalog/waterproofing/peneplag.html?любой_текст

При этом главная страница нормально грузиться — http://www.omega-gc.ru/?любой_текст

Нужно это для того чтобы добавить ко всем страницам UTM метки, для подключения Google Analytics.
пример - http://www.site.ru/catalog/waterproofing/peneplag.html?utm_source=Yandex.Direct&utm_medium=cpc&utm_term=Peneplag&utm_content=peneplag&utm_campaign=penetron

Прочитав все предыдущие посты я сделал так -
RewriteCond %{QUERY_STRING} ^utm_source
RewriteRule ^.*$ http://%{HTTP_HOST}/$0? [R=301,L,E=RWR:yes]

поставил редирект со всех страниц которые идут с добавкой utm_source на обычную страницу.
Вроде как все работает и поставленной задачи я достиг, но хотел бы узнать правильно ли я поступил? то есть, возможно надо было искать проблему глубже в хостинге или движке? CMS на сайте - Bitrix и это геморой еще тот :D

2014.03.05 14:28:11
#cid87877

Ответить

#cid87756, Макс

так грузится — http://www.site.ru/catalog/waterproofing/peneplag.html
так не грузится — http://www.site.ru/catalog/waterproofing/peneplag.html?любой_текст

Похоже на проблему (или особенность) движка.

Прочитав все предыдущие посты я сделал так -
RewriteCond %{QUERY_STRING} ^utm_source
RewriteRule ^.*$ http://%{HTTP_HOST}/$0? [R=301,L,E=RWR:yes]

Ну, т.е. убрал запросную часть урла. Переменные из неё теперь не попадут в соответствующий скрипт. Не понимаю, как это может работать.

но хотел бы узнать правильно ли я поступил? то есть, возможно надо было искать проблему глубже в хостинге или движке? CMS на сайте - Bitrix и это геморой еще тот :D

Надо смотреть движок. :)
Записи в .htaccess тут не решение, а костыль.

Макс
2014.03.13 14:20:42
#cid88554

Ответить

#cid87877,

#cid87756, Макс

Похоже на проблему (или особенность) движка.

Ну, т.е. убрал запросную часть урла. Переменные из неё теперь не попадут в соответствующий скрипт. Не понимаю, как это может работать.

Надо смотреть движок. :)
Записи в .htaccess тут не решение, а костыль.

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

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

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

P.S.
Отдельный респект вам админ за дельную тему по .htaccess и огромный кладязь инфы в коментах, так как я когда решал свою проблему - перерыл пол интернета и везде находил только общую информацию, которую копировали друг у друга. Тут же в коментах решаются реальные проблемы - реальных людей и я прочитав все коменты до единого, смог самостоятельно исправить свою проблему (хоть и не так как надо) но все же костыль лучше чем просто сломанная нога без поддержки.
Желаю вам удачи и творческих успехов. :D

Glorymirror
2014.03.21 00:20:29
#cid89056

Ответить

Приветствую.
Как преобразовывать адреса типа http://имя.домена/модуль в http://имя.домена/index.php?nloc=модуль.
Ибо данный код вызывает рекурсию.

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^(.*)/(.*)$
RewriteRule (.*) index.php?nloc=$2 [R=301,L]

2014.03.21 03:55:58
#cid89057

Ответить

#cid89056, Glorymirror

Основная ошибка: когда обращаешься к переменной из RewriteCond — надо использовать не «$», а «%».

RewriteRule .* index.php?nloc=%2 [R=301,L]

Glorymirror
2014.03.21 06:58:31
#cid89060

Ответить

#cid89057,

#cid89056, Glorymirror

Основная ошибка: когда обращаешься к переменной из RewriteCond — надо использовать не «$», а «%».

RewriteRule .* index.php?nloc=%2 [R=301,L]

С % все равно не работает. Так же циклическая переадресация, но в nloc постоянно пишется index.php не зависимо, ставлю я %1 или %2 или %3. Захожу допустим имя.домена/main, но в nloc так же index.php вставляет.

2014.03.21 08:51:41
#cid89061

Ответить

#cid89060, Glorymirror

С % все равно не работает. Так же циклическая переадресация, но в nloc постоянно пишется index.php не зависимо, ставлю я %1 или %2 или %3. Захожу допустим имя.домена/main, но в nloc так же index.php вставляет.

Возможно, идёт конфликт с ранними правилами в .htaccess или с самим движком.
Можно для надёжности добавить уточняющий фильтр, который исключит переадресацию с index.php.
А вообще структура, именование переменных и подобные задачи уже рассматривались в комментариях.

Борис
2014.03.24 12:55:10
#cid89072

Ответить

ДОбрый день, буду благодарен если подскажете, что прописать в .htaccess или тыкнете где это выше...все прочитал, но не нашел аналогичного запроса

У меня есть страницы (их много) типа
http://syte.ru/schools/french/item/latelier9 - основная страница
дубль:
http://syte.ru/schools/french/item/latelier9?category_id=90
как сделать редирект на основную страницу, отрезав все начиная со знака ? --- ?category_id=ХХ (ХХ разные цифры, дублей много)
а то Яндекс выкинул из поиска 1000 моих страниц (((

Станислав
2014.04.29 14:42:13
#cid89230

Ответить

Доброе время суток!
О гуру .htaccess'а, бьюсь над проблемой неделю, ничего не выходит, прошу хэлпа.
Есть ссылка:
http://site.net/katalog/69/vilochnyj-pogruzchik-LONKING-FB20.html
необходимо из нее сделать:
http://site.net/vilochnyj-pogruzchik-LONKING-FB20.html

Написал простое правило:
RewriteEngine on
RewriteBase /
RewriteRule ^katalog/69/(.+)$ http://specimport.net/$1 [R=301,L]
оно отрабатывает, адрес встает какой нужно, но сервер возвращает:
The requested URL was not found on this server.
Да, и еще вот этот /69/ номер, у всех позиций каталога разный, как это прописать в правилах тоже пока не понял.

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

2014.05.06 12:46:04
#cid89241

Ответить

#cid89072, Борис

ДОбрый день, буду благодарен если подскажете, что прописать в .htaccess или тыкнете где это выше...все прочитал, но не нашел аналогичного запроса

У меня есть страницы (их много) типа
http://syte.ru/schools/french/item/latelier9 - основная страница
дубль:
http://syte.ru/schools/french/item/latelier9?category_id=90
как сделать редирект на основную страницу, отрезав все начиная со знака ? --- ?category_id=ХХ (ХХ разные цифры, дублей много)
а то Яндекс выкинул из поиска 1000 моих страниц (((

Всё, что идёт после знака вопроса в урле — это переменные для скрипта на сервере.
Если они не нужны, надо редактировать скрипт, а не править .htaccess.

2014.05.06 12:54:41
#cid89242

Ответить

#cid89230, Станислав

RewriteRule ^katalog/69/(.+)$ http://specimport.net/$1 [R=301,L]
оно отрабатывает, адрес встает какой нужно, но сервер возвращает:
The requested URL was not found on this server.

Если адрес встаёт, значит правило работает, а ошибка в чём-то другом. Случайно не на денвере проверяешь?

Да, и еще вот этот /69/ номер, у всех позиций каталога разный, как это прописать в правилах тоже пока не понял.

Дык типа:

RewriteRule ^katalog/(\d+)/(.+)$ http://specimport.net/$2 [R=301,L]

А деньги за рекламу сайта заноси на электропочту.

Станислав
2014.05.06 13:43:04
#cid89245

Ответить

Эх, точно, адрес сайта не потер, пардон. ))

Нет, не на денвере, проверяю в сети на боевом.
Быть может серверу надо как-то сказать чтобы по адресу:
http://site.net/vilochnyj-pogruzchik-LONKING-FB20.html
исполнялась страница:
http://site.net/katalog/69/vilochnyj-pogruzchik-LONKING-FB20.html

На сколько я понимаю правило:
RewriteRule ^katalog/(\d+)/(.+)$ http://specimport.net/$2 [R=301,L]
лишь убирает "ненужное" из ссылки, а из конечной ссылки выходит, что страницы действительно не существует.

2014.05.06 13:55:37
#cid89247

Ответить

#cid89245, Станислав

На сколько я понимаю правило:
RewriteRule ^katalog/(\d+)/(.+)$ http://specimport.net/$2 [R=301,L]
лишь убирает "ненужное" из ссылки, а из конечной ссылки выходит, что страницы действительно не существует.

Тогда надо пилить движок. Всё остальное — унылые и беспомощные костыли.

Павел
2014.06.16 17:17:58
#cid89394

Ответить

Добрый день
на сервере несколько сайтов, они работают по управлением 1 системы управления контентом
необходимо сделать переписать правило

RewriteRule ^/*catalog/([0-9]+).html$ /oldprod.php?codes=$1 [QSA,L]

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

т.е RewriteRule (%{HTTP_HOST} ^(site\.ru)|(www\.site\.ru)) && (^/*catalog/([0-9]+).html)$ /oldprod.php?codes=$1 [QSA,L]

так правильно?

2014.06.17 17:31:27
#cid89395

Ответить

#cid89394, Павел

т.е RewriteRule (%{HTTP_HOST} ^(site\.ru)|(www\.site\.ru)) && (^/*catalog/([0-9]+).html)$ /oldprod.php?codes=$1 [QSA,L]

так правильно?

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

Джонни
2014.06.18 08:51:07
#cid89398

Ответить

Добрый день, у меня вот такая проблема. CMS выдает адреса такого типа:
http://site.ru/?cultureKey=&q=contacts/
http://site.ru/?cultureKey=&q=news/

Нужно чтобы урлы приобрели вот такой вид:
http://site.ru/contacts/
http://site.ru/news/

те чтобы ?cultureKey=&q= удалялось из урла.
Как правильно сделать редирект с помощью .htacces ?

2014.06.18 15:06:36
#cid89399

Ответить

#cid89398, Джонни

Добрый день, у меня вот такая проблема. CMS выдает адреса такого типа:
http://site.ru/?cultureKey=&q=contacts/
http://site.ru/?cultureKey=&q=news/

Нужно чтобы урлы приобрели вот такой вид:
http://site.ru/contacts/
http://site.ru/news/

те чтобы ?cultureKey=&q= удалялось из урла.
Как правильно сделать редирект с помощью .htacces ?

Подобное решение было. Ищи в комментариях.

Алексей
2014.06.27 20:21:41
#cid89412

Ответить

Прошу совета в следующем.
Есть файлы в названиях которых цифры и английские буквы (код).
Хотелось бы сохранять такие файлы с новым именем на русском.
Предполагаю передавать в ссылке на скачивание дополнительный параметр - русское название.
Например, /downloads/file001.pdf?newname='Имя файла на русском'.
В htaccess думаю смотреть в сторону
Header set Content-disposition "attachment; filename='.$newname.'"
Но как всё это реализовать? Пока затрудняюсь..
Если по русски никак, то хотя бы передавать новое название на английском.

Не нашёл ничего подобного в Интернете.

2014.06.30 11:59:01
#cid89413

Ответить

#cid89412, Алексей

Всё, что после знака вопроса — это скриптовая часть. Соответственно, выдавать файл на скачивание должен скрипт.

.htaccess оперирует урлами. Несуществующий (виртуальный) путь в урле обрабатывается конкретным существующим скриптом, который и выдаёт страницу. Если у страницы есть заголовок (title), то при сохранении страницы браузер может предложить имя, взятое оттуда.

В данном же случае настоящий файл — с именем на латинице, браузер это понимает, ведь он сам делает http-запрос. Заголовка, который можно распарсировать и предложить новое имя, в файле нет. Поэтому браузер предложит сохранить файл под оригинальным именем, на латинице.

В общем, даже если есть способ решить задачу с помощью .htaccess, то я его не знаю.
И чисто технически это неправильно.

Алексей
2014.06.30 12:38:34
#cid89415

Ответить

#cid89412, Алексей

Спасибо за разъяснения. Буду копать в сторону скриптовой обработки.

Inkognito ;)
2014.07.15 14:21:21
#cid89439

Ответить

Приветствую,
Есть такая проблемка
nginx - фронт
apache - тыл
CMS - Joomla + JoomSEF
Проблема:
реальный домен. www.host.com/category/article
фейк домен (вводится любой). 23432www.host.com/category/article преобразуется в www.23432www.host.com/category/article
а нужно, чтобы перебрасывал на www.host.com/category/article

Частично работает решение в .htaccess
RewriteCond %{HTTP_HOST} !^www.host.com$ [NC]
RewriteCond %{HTTP_HOST} host.com$ [NC]
RewriteRule ^(.*)$ www.www.host.com/$1 [R=301,L]
но редиректит строго на корень www.host.com - т.е. параметр S1 не срабатывает
Аналогичная конструкция в конфиге nginx не работает вообще.

Как починить?
Спасибо.

2014.07.15 15:11:54
#cid89441

Ответить

#cid89439, Inkognito ;)

nginx - фронт

Сразу нет.

Насколько я знаю, .htaccess в nginx работает нештатно, поддерживается через костыли. От этого очень много проблем и непредсказуемого поведения. Зависит от настроек сервера.

Так что извиняй.

imen
2014.07.16 17:46:01
#cid89448

Ответить

#cid89441,

Сразу нет.

Насколько я знаю, .htaccess в nginx работает нештатно, поддерживается через костыли. От этого очень много проблем и непредсказуемого поведения. Зависит от настроек сервера.

Именно поэтому как ни лень, но _необходимо_ вместо попытки притащить знакомое и привычное решение на новую платформу сформулировать вопрос «зачем оно нужно» (какие задачи решает)? И хотя бы озвучить (и попробовать поискать ответ) вопрос о способах решения тех же задач на новой платформе.
А то мы уже имеем достижение в виде гуя на линуксовых серверах…

Inkognito ;), начни с размещения здесь подирективного анализа приведённого правила замены. Проверял цитировавшиеся мной варианты: работает как надо (перебрасывает на тот же скрипт, что и был в пути с неправильным доменным именем).

Алексей
2014.07.18 12:21:01
#cid89452

Ответить

Всем добрый день!

Мне нужно выдавать 410 (Resource is no longer available!) в двух случаях:
1) если в URL обнаружили знак &
2) если в URL параметр page не равен цифре.

Регулярку пишу в .htaccess

Написал такое: page=\D|&

Наблюдаю интересное явление.

Если перехожу по ссылке вида sayt.ru/abrakodabra& , то прекрасно выдает 410
Если перехожу по ссылке sayt.ru/& тоже выдает 410
Однако по ссылке sayt.ru/index.php?page=2& не выдает 410.

Также по ссылке вида sayt.ru/page=xx выдается 410, однако
по ссылке вида sayt.ru/index.php?page=xx не выдает 410

P.S. Ведь тоже самое я проверил в PHP preg_match и там такая регулярка отрабатывает корректно, а здесь нет - странно Растерялся

Подскажите пожалуйста, как исправить регулярку

Заранее спасибо!

Сергей
2014.07.22 18:54:00
#cid89474

Ответить

Здравствуйте. Необходимо сделать 301 редирект адресов вида catalogue.html?gr=аааа&pt=аааааа (которые не существуют, если это важно) на catalog/factory/product/

Сделал. Не работает

# BEGIN WordPress

RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]

RewriteCond %{REQUEST_URI} ^(catalogue\.html\?gr=.+&pt=.+)
RewriteRule (.*) catalog/factory/product/ [R=301,L]

# END WordPress

php_value memory_limit 64M

2014.07.22 20:10:28
#cid89475

Ответить

#cid89474, Сергей

которые не существуют, если это важно

Важно. Срабатывает стандартное перенаправление на index.php, раньше твоего.

Порядок правил имеет значение.
Поменяй последний и предпоследний блоки местами.

2014.07.22 20:16:46
#cid89476

Ответить

#cid89452, Алексей

Всем добрый день!

Мне нужно выдавать 410 (Resource is no longer available!) в двух случаях:
1) если в URL обнаружили знак &
2) если в URL параметр page не равен цифре.

Регулярку пишу в .htaccess

Написал такое: page=\D|&

Наблюдаю интересное явление.

Если перехожу по ссылке вида sayt.ru/abrakodabra& , то прекрасно выдает 410
Если перехожу по ссылке sayt.ru/& тоже выдает 410
Однако по ссылке sayt.ru/index.php?page=2& не выдает 410.

Также по ссылке вида sayt.ru/page=xx выдается 410, однако
по ссылке вида sayt.ru/index.php?page=xx не выдает 410

Всё, что после знака «?» в урле — это запросная часть, QUERY_STRING. Разные переменные в запросной части отделяются знаком «&».

RewriteRule работает с "усечённым" урлом, БЕЗ запросной части.

Михаил
2014.07.23 23:32:19
#cid89488

Ответить

Здравствуйте, необходимо сделать редирект с адресов без www на www, но он не должен распространятся на домены третьего уровня

RewriteEngine on
RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]

Такой вариант делает редиректы и для msk.site.ru, но этого не нужно, подскажите пожалуйста как решить задачу.
Папка с файлами общая, поэтому .htaccess тоже общий.
Желательно решить проблему общим скриптом, без прописывания отрицания для доменов типа msk.site.ru, так как таких доменов может быть очень много и будет огромный список.

2014.07.24 13:58:02
#cid89489

Ответить

#cid89488, Михаил

Такой вариант делает редиректы и для msk.site.ru, но этого не нужно, подскажите пожалуйста как решить задачу.

У меня точно такое же правило и всё работает корректно. С поддоменов не перенаправляет.
Ищи ошибку в другом месте.

1. Где "RewriteBase /"? Без этой инструкции твой "RewriteRule" будет делать перенаправление на несуществующий урл, что может быть причиной для срабатывания других правил.

2. Проверь порядок правил, он имеет значение. Для надёжности поставь редирект в самое начало.

3. Не забывай, что "www" — это тоже домен третьего уровня, ничем не отличающийся от "msk" и других.

Михаил
2014.07.24 14:28:53
#cid89490

Ответить

Спасибо за подсказку, действительно PHP редирект был дополнительно.

if(strstr($_SERVER['HTTP_HOST'],'www.')===false){
header('Location: http://www.'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit();
}

Убрал его, все теперь как надо работает.

2014.07.25 00:31:39
#cid89497

Ответить

#cid89490, Михаил

Атас! Это ж в каком движке такое? Подскажи название, чтоб никогда им не пользоваться )

Вова
2014.07.28 15:29:08
#cid89508

Ответить

Подскажите, возможно ли такое реализовать.
На сайте есть УРЛы, в которых встречаются слово nemtsy, nemtsa, nemtsu (от слова немец).
Нужно заменить УРЛы, отловив эти слова и заменить в них ts на c, т.е. nemtsa на nemca.
У этих слов общая часть nemts, должна заменятся на nemc. Но это слово может быть в начале УРЛа, в конце и в середине.
Можно ли создать такое правило?

Спасибо!

2014.07.28 20:53:07
#cid89510

Ответить

#cid89508, Вова

Можно ли создать такое правило?

Да.

Разобравшись с материалом это можно сделать без особого труда.

Михаил
2014.07.29 00:59:03
#cid89511

Ответить

#cid89497,

#cid89490, Михаил

Атас! Это ж в каком движке такое? Подскажи название, чтоб никогда им не пользоваться )

Самописка

2014.08.04 09:26:34
#cid89512

Ответить

#cid89511, Михаил

Все перенаправления из .htaccess включаются на стадии подготовки урла, сразу после получения запроса. Задействуется только mod_rewrite.

Перенаправления из скрипта требуют гораздо больше "левых" операций на сервере: нужен mod_rewrite, mod_php (или что там вместо него), возможно дополнительные модули, плюс собственно запуск скрипта. По факту вся эта кодла работает вхолостую — только зря напрягает сервер.

Поэтому обработку урлов надо всегда выносить в .htaccess.

name
2014.09.05 04:20:18
#cid89625

Ответить

здравствуйте, как (с помощью RewriteRule) сделать редирект с адреса, с определёнными переменными в GET, на другой адрес?

с этого: http://site.com/old/pageold.php?one=a&two=e
на этот: http://site.com/new/pagenew.php

(и чтобы эти переменные в GET не передавались на новый адрес)
(задание кажется простым, так как многие сталкиваются с ним, но не могу найти решения уже не один час)

2014.09.05 09:13:51
#cid89626

Ответить

#cid89625, name

Используй RewriteCond и переменную %{QUERY_STRING}.
Для отсечения переменных используй знак вопроса в RewriteRule (см. примеры).
Что-то подобное было в комментариях.

name
2014.09.05 22:23:58
#cid89636

Ответить

#cid89626,

спасибо
вот так работает, но на всякий случай переспрошу, так правильно?

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^one=a&two=e$
RewriteRule ^old/pageold\.php$ http://site.com/new/pagenew.php? [L,R=301]

потому что вчера делал точно также, но не работало, то ли не было редиректа, то ли переменные в GET передавались новому адресу, точно не помню что было не так
(для тех кто делает методом проб и ошибок, удаляйте кэш и другие данные браузера)

2014.09.05 23:49:56
#cid89639

Ответить

#cid89636, name

вот так работает, но на всякий случай переспрошу, так правильно?

Вроде да.
Если работает — точно правильно )

(для тех кто делает методом проб и ошибок, удаляйте кэш и другие данные браузера)

Файрфокс сильно этим страдает: сохраняет то, что не следовало бы сохранять.
Если это не знать, можно с ума сойти тестируя.

name
2014.09.07 03:32:46
#cid89641

Ответить

#cid89639,

Если работает — точно правильно )

да, всё как надо, ещё раз спасибо

не только фаерфоксе но и на хроме, в основном, одинаково было

Если это не знать, можно с ума сойти тестируя.

очень понимаю )
всего доброго

Денис
2014.09.24 10:31:35
#cid89710

Ответить

Подскажите как сделать чтобы происходила подмена каталога.
т.е. каталог /catalog/ подменялся /catalog_vol/ без переадресации.
Чтобы в ссылке стояло /catalog_vol/ но фактически данные шли из /catalog/

2014.09.24 10:58:27
#cid89711

Ответить

#cid89710, Денис

Без переадресации — убрать флаг R=301 из RewriteRule.
Про остальное было в комментариях.
Про R=301 тоже, кстати, было.

Денис
2014.09.24 11:08:52
#cid89712

Ответить

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

2014.09.25 01:14:38
#cid89721

Ответить

#cid89712, Денис

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

RewriteRule ^/catalog_vol/(.*) catalog/$1

Типа того. И про "RewriteBase /" не забываем.

Сергей
2014.11.05 02:58:33
#cid89890

Ответить

Здравствуйте!
Помогите, пожалуйста написать правило для вырезания частей URL-a
Вот есть такой URL:
index.php?option=com_virtuemart&Itemid=518&lang=ru&tmpl=component&view=productdetails&virtuemart_category_id=16&virtuemart_product_id=195
из него необходимо вырезать: &Itemid=518 и &tmpl=component, но при этом все id могут быть разными (Itemid=518; virtuemart_category_id=16; virtuemart_product_id=195).
Заранее благодарю.

Kir
2014.11.06 23:11:54
#cid89894

Ответить

Приветствую!

Тоже вопрос по RewriteRule и магазин virtuemart.
Нужно в конце url добавить #anchor к каждой ссылке в которой встречается, например: option=com_virtuemart или просто com_virtuemart .
пример url http://www.sait.ru/index.php?page=shop.browse&category_id=414&option=com_virtuemart&Itemid=105
или http://www.sait.ru/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=585&category_id=125&option=com_virtuemart&Itemid=105

Нужно чтобы дописывалось и срабатывал якорь #ank и была ссылка вида http://www.sait.ru/index.php?page=shop.browse&category_id=414&option=com_virtuemart&Itemid=105#ank или для второго примера http://www.sait.ru/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=585&category_id=125&option=com_virtuemart&Itemid=105#ank.

Что-то сам пытаюсь, но ничего, вот бардак с которым пробовал:

RewriteEngine On
RewriteBase /

#RewriteCond %{QUERY_STRING} ^(.*)Itemid=$
#RewriteRule ^(.*) /$1?%1 [R=301,L]

RewriteCond %{HTTP_HOST} ^kma.nichost\.ru$ [NC]
RewriteRule ^(.*)$ http://www.kma.nichost.ru/$1 [R=301,L]

#RewriteRule ^test/ /Itemid=105#ank [R,NE]
#RewriteRule ^Itemid=105$ ^Itemid=105#ank [R]

#RewriteRule (.*) $1? [R=301,L]

#RewriteCond %{REQUEST_URI} /sample\.php$
#RewriteCond %{QUERY_STRING} ^id=1$
#RewriteRule .* https://example.com/sample/#tag [R=301,NE,L]

#RewriteCond %{QUERY_STRING} ^page=shop.browse&category_id=265&option=com_virtuemart&Itemid=105$
#RewriteCond %{QUERY_STRING} ^id=1$
#RewriteRule .* http://www.sait.ru/index.php#ank [R=301,NE,L]

RewriteCond %{QUERY_STRING} com_virtuemart [NC]
RewriteCond %{PHP_SELF} ^/index.php$ [NC]
RewriteRule (.*) $1? [R=301,L]

#RewriteCond %{QUERY_STRING} Itemid [NC]
#RewriteCond %{PHP_SELF} ^/index.php$ [NC]
#RewriteRule (.*) main.php [R=301,L]

бардак! )

Максим
2014.11.10 18:47:24
#cid89900

Ответить

Здравствуйте.

Помогите пожалуйста настроить правильную переадресацию с поддомена на домен.

На сайте есть раздел с Оружием - http://www.site.com.ua/Oruzhie
Из-за новой политики Пoogle Adwords - нужно создать поддомен и перенести все товары туда.

Поддомен будет такой - http://hunter.site.com.ua/
Нужно настроить 301 редирект с http://www.site.com.ua/Oruzhie на http://hunter.site.com.ua/

Плюс все остальные подразделы и страницы, которые были внутри http://www.site.com.ua/Oruzhie - перенесутся точно так же

было - http://www.site.com.ua/Oruzhie-Pnevmaticheskoe-oruzhie
будет - http://hunter.site.com.ua/Oruzhie-Pnevmaticheskoe-oruzhie

Не могу понять вот что, будет ли у поддомена свой .htaccess
если да то где и как прописывать, по факту у меня 2 .htaccess - один домена, один поддомена

Я так понимаю в .htaccess домена мне надо прописать следующее:

Redirect 301 /Oruzhie http://hunter.site.com.ua/
Redirect 301 /Oruzhie-Pnevmaticheskoe-oruzhie http://hunter.site.com.ua/Oruzhie-Pnevmaticheskoe-oruzhie

и так далее для всех включая карточки товара
Redirect 301 /Pnevmaticheskij-pistolet-KWC-PM http://site.com.ua/Pnevmaticheskij-pistolet-KWC-PM

Алексей
2014.11.30 21:03:50
#cid89959

Ответить

Приветствую!
Есть проблема у сайтов на CMS Webasyst, заключающаяся в том, что страницы категорий типа:
http://site.ru/category/mebel/
могут иметь сколько угодно дублей вида:
http://site.ru/что-угодно/category/mebel/
http://site.ru/что-угодно/что-угодно/category/mebel/
http://site.ru/что-угодно/что-угодно/что-угодно/category/mebel/
и т.д.
На форуме самого движка пару раз поднимался данный вопрос, но администрация игнорирует (видимо и сами толком не соображают в этом вопросе), а пользователями решение не найдено.
На всякий случай привожу код .htaccess что идет в системе по умолчанию:

# WebAsyst .htaccess config

AddDefaultCharset UTF-8
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^shop/(repo_themes|js|3rdparty|images_common|products_pictures|images|themes|css)/(.*)$ published/SC/html/scripts/$1/$2?frontend=1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(repo_themes|js|3rdparty|images_common|products_pictures|images|themes|css)/(.*)$ published/SC/html/scripts/$1/$2?frontend=1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(imgval.php|wbs_messageserserver.php|get_file.php) published/SC/html/scripts/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^login/(.*) login/index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^installer/(.*) installer/index.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^published
RewriteRule (.*) published/SC/html/scripts/index.php?__furl_path=$1&frontend=1 [QSA]

Сергей
2014.12.17 22:44:54
#cid90020

Ответить

Здравствуйте.
Прошу Вашей помощи для создания редиректа. У самого никак не получается.

Нужно сделать 301 редирект со страниц вида
http://domen.com/product/luboy-product/luboy-simvol
на
http://domen.com/product/luboy-product/

Делаю так:
RewriteRule ^product/([a-zA-Z0-9-]+)/([^/])$ http://%{HTTP_HOST}/product/$1/ [R=301,L]

но это правило не срабатывает.
В чём моя ошибка?

Артур
2015.01.30 20:56:42
#cid90213

Ответить

Здравствуйте, прочитал все выше написанное и потерялся во всем этом, заранее прошу прощения, если задам вопрос на который, уже бы ответ.

У меня не проходит редирект:

redirect 301 /fotootchety.html?limitstart=0 http://pbalkon.ru/fotootchety.html
redirect 301 /otzyvy.html?limitstart=0 http://pbalkon.ru/otzyvy.html

Как еще можно его осуществить?

Спасибо.

Дмитрий
2015.02.04 14:10:54
#cid90240

Ответить

#cid90020, Сергей

Здравствуйте.
Прошу Вашей помощи для создания редиректа. У самого никак не получается.

Нужно сделать 301 редирект со страниц вида
http://domen.com/product/luboy-product/luboy-simvol
на
http://domen.com/product/luboy-product/

Делаю так:
RewriteRule ^product/([a-zA-Z0-9-]+)/([^/])$ http://%{HTTP_HOST}/product/$1/ [R=301,L]

но это правило не срабатывает.
В чём моя ошибка?

\-

Дмитрий
2015.02.04 14:13:25
#cid90241

Ответить

Добрый день.
Давненько не был, как все изменилось.
Админ еще консультирует?

2015.02.04 16:54:38
#cid90243

Ответить

#cid90241, Дмитрий

Давненько не был, как все изменилось.

Да вроде всё как и раньше.

Админ еще консультирует?

Изредка.
Большинство вопросов из разряда "не хочу ни в чём разбираться, не хочу ничего читать, мне плевать, что моя задача уже решена в комментариях, а ты всё брось и напиши мне решение здесь и сейчас".
Поэтому — изредка.

imen
2015.02.05 16:46:11
#cid90246

Ответить

#cid90243,

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

Увы, но это даже не половина проблемы, а так… _фрагмент_ вершины айсберга.
Проблема утраты культуры работы с документацией сопровождается с тенденцией к утрате культуры написания оной документации.

Значительная часть оного «большинства вопросов» в том числе указывает хорошо если только на несовершенство (часто ещё и на неполноту, в особо тяжёлых случаях это дополняется ещё и… особенностямит реализации).
В качестве альтернативы предлагается изучение обсуждения и шаманства вокруг рецептов, не страдающих от достаточной полноты. Не говоря об указании на зависимости.

Касаемо не комментариев, но самой заметки:
1. На этом заборе http://perldoc.perl.org/perlre.html написано, что Perl Regular Expression ≠ PCRE.
2. А на этом http://www.pcre.ru/docs/apache/text/modrewrite-2/ написано, что mod_rewrite использует как раз-таки _PCRE_.
3. И в таком контексте обойтись без хотя бы упоминания, а лучше обзора POSIX RE никак нельзя.
4. Также категорически желательно, если уж журналы, даже в рамках стенда, недоступны, использовать утилиты проверки регулярных выражений.
Ситуация с которыми сама по себе — песня. Например https://github.com/luksan/kodos
Но некоторые нестойкие товарищи предпочитают http://www.regexbuddy.com/

imen
2015.02.09 09:18:58
#cid90261

Ответить

#cid90246, imen

Вдогонку к 4 я бы отметил также существование где-то даже рабочих (помним про нюанс Perl/PCRE/POSIX) web-сервисов.
Из некогда вроде рабочего я бы отметил http://www.regexe.com/

imen
2015.02.09 17:02:48
#cid90262

Ответить

И туда же стоит отнести:
[I] dev-util/redet
Available versions: (~)8.26
Installed versions: 8.26(13:56:03 02.07.2013)
Homepage: http://www.billposer.org/Software/redet.html
Description: A regular expression development and execution tool

dima
2015.03.24 10:39:30
#cid90404

Ответить

Здравствуйте, уважаемые форумнчане!

Прошу помочь решить следующую насущную для мультиязычного сайта на Joomla 3 и, думаю, многих других CMS, проблему:
При создании нескольких языковых версий сайта средствами мультиязычности самой CMS получается следующее:
http://domain.ru -с русским языком
http://domain.ru/ru/-русская версия сайта(является основным языком сайта)
http://domain.ru/en/-английская версия сайта
http://domain.ru/de/-немецкая версия сайта
и если средствами Joomla 3 удалять префикс /ru/ из адресной строки, то срабатывает 303 редирект, что есть нехорошо, т.к. для SEO нужен 301 редирект.
Если же не убирать префикс в настройках Joomla 3, то будет существовать domain.ru/ru/ и domain.ru с русским языком, т.е. дубли.
Как посредством .htaccess убрать префикс /ru/, т.е. сделать 301 редирект с domain.ru/ru/ -> domain.ru и чтобы в последующем переключение языков на сайте было корректным.

В течение 2-x недель поиска информации в интернете опробовал разные куски кода в htaccess, но рабочего варианта так и не нашел.
Распишите, пожалуйста, подробно как решить эту проблему, т.к. с этим вопросом не могут справится куча народа, как в русскоязычном сегменте интернета, так и зарубежом, либо опишите другие возможные варианты решения.
Если для кого-то это тривиально, то простите за незнание! :-)

Борис
2015.03.26 08:32:07
#cid90408

Ответить

Спасибо за сайт, Злой Админ! Редко такое встретишь... если вообще встретишь...
Помогите, пожалуйста сделать две системные точки доступа...

Условия:
Если обращаться к сайту и всем папкам и подпапкам (кроме одной) - то точка доступа - лежащий в корне index.php
Если же обратиться к этой оставшейся папке, скажем /zone/ то сделать точкой доступа файл /zone/index.php

Большое спасибо!

2015.03.26 19:42:58
#cid90412

Ответить

#cid90408, Борис

Спасибо за сайт, Злой Админ! Редко такое встретишь... если вообще встретишь...

Да вроде сайт как сайт. Что необычного-то?

Условия:
Если обращаться к сайту и всем папкам и подпапкам (кроме одной) - то точка доступа - лежащий в корне index.php
Если же обратиться к этой оставшейся папке, скажем /zone/ то сделать точкой доступа файл /zone/index.php

Вариант 1:

DirectoryIndex index.php (если сайт у провайдера, эта настройка должна быть доступна через веб-интерфейс)

RewriteBase /

...

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/zone/
RewriteRule .* index.php [L]

Вариант 2:

RewriteBase /

...

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/zone/
RewriteRule .* zone/index.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]

Типа того.
Первый вариант предпочтительнее, в нём меньше проверок.
Писал по памяти, на практике не проверял, поэтому могут быть косяки.

Игорь
2015.04.08 16:00:14
#cid90461

Ответить

Помогите гуру!

Не пойму в чем дело, есть index.php ну либо любой другой .php
когда урл вида domain.com/index.php - все хорошо! но если поставить в конец '/' то все летит к чертям! domain.com/index.php/ или index.php///// я так понял что убрать эти лишние слешы можно через htaccess ? или в php дело ?

Спасибо!

2015.04.08 20:02:18
#cid90462

Ответить

#cid90461, Игорь

когда урл вида domain.com/index.php - все хорошо! но если поставить в конец '/' то все летит к чертям!

/index.php — это файл.
/index.php/ — это каталог. Если такого каталога на сервере нет — значит, виртуальный каталог.

С лишними слэшами (как и с любыми другими "неправильными" урлами) надо бороться на стадии генерирования ссылок (например, откуда у тебя взялся лишний слэш в конце адреса? А если бы это был не слэш, а какой-нибудь другой символ?)
Бороться с последствиями ошибки неправильно. Правильно — искоренять причину.

Игорь
2015.04.09 13:25:47
#cid90463

Ответить

Лишний слеш друг поставил случайно, и говорит мол смотри что произошло весь сайт перекосило )) Вот и нужно решить этот вопрос, чтобы вдруг еще кто поставит слеш в конце .php файла и чтобы он не думал что это директория...
Возможно ли это сделать средствами htaccess ? указать мол что на сайте вообще нет виртуальных директорий или типа если этой директории нет, перекидывать на 404 ошибку, а она же у меня index.php

Игорь
2015.04.09 19:45:17
#cid90464

Ответить

Все нашел решение если кому интересно:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]

2015.04.09 20:07:06
#cid90465

Ответить

#cid90463, Игорь

Лишний слеш друг поставил случайно, и говорит мол смотри что произошло весь сайт перекосило ))

— Доктор, когда я так делаю, у меня болит.
— А вы так не делайте.

"Защита от дурака на все случаи жизни" не влезет ни в один .htaccess. Да никто и не будет её делать.
Лезешь в урлы руками и не соблюдаешь правила? — сам себе злобный буратино.

#cid90464, Игорь

Все нашел решение если кому интересно:

Попытка входа в реальный каталог может привести к зацикливанию в виде бесконечного редиректа.

Олеся
2015.04.10 13:15:46
#cid90468

Ответить

Здравствуйте!
У меня проблема появилась после написания правила редиреккта со страниц без .html на .html...

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+)$ /$1.html [R=301,L]
RewriteRule . /index.php [L]

Но теперь я не могу зайти в админку WP...

Подскажите пожалуйста, что нужно дописать?!

Здесь у меня ошибка в написании, но примерно это?!

RewriteCond %{REQUEST_URI} !^/wp-admin
RewriteCond %{REQUEST_URI} !^/wp-login.php$

2015.04.10 14:57:56
#cid90469

Ответить

#cid90468, Олеся

У меня проблема появилась после написания правила редиреккта со страниц без .html на .html...

Сами файлы .html существуют?
Если нет, то такие файлы обрабатывает движок и в .htaccess ничего вносить не надо, это неправильно.
Если да, то надо добавить правило (перед глобальной переадресацией на /index.php):

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule .* %{REQUEST_FILENAME}.html [L]

%{REQUEST_FILENAME} — это всего лишь переменная. Насколько я знаю, первый параметр RewriteCond принимает строку и не обязан быть равен какой-либо переменной.

Здесь у меня ошибка в написании, но примерно это?!

Во входе принимает участие ещё несколько файлов. Вдобавок, небось, ещё и часть функций сайта слетела.
Поэтому не надо менять все урлы, меняй только нужные.

Олеся
2015.04.13 10:19:45
#cid90479

Ответить

Спасибо большое за помощь!

Дмитрий
2015.05.10 14:00:09
#cid90568

Ответить

Ситуация такая, нужно выпарсить с урлов середину такого ввида
site.ru/low-вотэтовыпарсить-end-32324.html

и отправить на другой сайт пример

site2.ru/search?=сюда

2015.05.11 02:20:28
#cid90572

Ответить

#cid90568, Дмитрий

И в чём проблема? В комментах всё есть.

С помощью RewriteCond запоминаем начало и конец, а в RewriteRule объединяем их уже без того, что надо выпарсить.

Дмитрий
2015.05.11 06:34:12
#cid90577

Ответить

"а в RewriteRule объединяем их уже без того, что надо выпарсить."

Не совсем понятно. Мне нужно середину урла выпарсить (ключевик) и передать его на поиск другого сайта. В комментах подобного не нашел.Покажите пожалуйста примером

2015.05.11 15:24:07
#cid90579

Ответить

#cid90577, Дмитрий

Не совсем понятно.

Я второпях понял так, что выпарсить===убрать.

Мне нужно середину урла выпарсить (ключевик) и передать его на поиск другого сайта.

Так получается ещё проще:

RewriteBase /

RewriteCond %{REQUEST_URI} ^low-(.*)-end-32324\.html$
RewriteRule .* http://site2.ru/search?=%1 [L,R=301]

Типа того.

И да, в комментах всё это есть.

Андрей
2015.05.24 17:02:35
#cid90623

Ответить

Такой файл
htaccess :
RewriteEngine on
RewriteBase /

отрабатывает при запросе http://test2ru/itkey
и не отрабатывает при наличии в запросе %2F () как побороть?http://test2ru/itkey-%2F

Андрей
2015.05.24 17:03:13
#cid90624

Ответить

RewriteRule ^(.*)$ 1.php?=1$ это к записи выше, пропустил

Вячеслав
2015.06.01 23:05:11
#cid90651

Ответить

Только на вас и надежда, помогите пожалуйста с htaccess:

есть:
cat.php_id=13.html

нужно:
cat.php?id=13.html

Пробывал, не вышло:

не получается #RewriteRule ^cat.php?id=([0-9]*)([0-9]*).html cat.php_id=$1$2.html[L]

2015.06.03 17:10:03
#cid90662

Ответить

#cid90624, Андрей

RewriteRule ^(.*)$ 1.php?=1$ это к записи выше, пропустил

1. Где переменная в запросной части урла?
2. %2F — это не пробел, а слэш, дробь, «/».
3. В целом по описанию непонятно, что есть и что надо получить.

2015.06.03 17:22:19
#cid90663

Ответить

#cid90651, Вячеслав

cat.php_id=13.html

Это файл с именем "cat.php_id=13" и расширением ".html"

cat.php?id=13.html

Это — файл с именем "cat.php", которому передаётся "%{QUERY_STRING} = 'id=13.html'"

#RewriteRule ^cat.php?id=([0-9]*)([0-9]*).html cat.php_id=$1$2.html[L]

А это — закомментированная попытка переделать урл второго вида (с запросом, хотя в RewriteRule запросная часть не участвует и её надо учитывать исключительно в RewriteCond), с неэкранированными спецсимволами (в первом параметре RewriteRule участвует шаблон, где точка — произвольный символ, вопросительный знак — сомнение в наличии предыдущего символа и т.д.) и с неправильным шаблоном в принципе.

не получается

Естественно. Здесь всё не так.
У тебя нет понимания того, что ты делаешь, поэтому надо учить матчасть. А делать твою работу за тебя я не буду.
«Дай человеку рыбу и он будет сыт один день, научи его ловить рыбу и он будет сыт всю жизнь» ©.
Всё есть в заметке и комментариях.

Сергей
2015.06.04 17:45:53
#cid90666

Ответить

Здравствуйте!
Как настроить 301 редирект с site.ru/group/item////// на site.ru/group/item/ ?
То есть нужно убрать слеши, кол-во слешей может быть произвольным.

2015.06.05 05:02:42
#cid90671

Ответить

#cid90666, Сергей

Это очень просто. Делается одной строкой.
Достаточно написать правильный шаблон, редирект и модификаторы для RewriteRule.
Но для этого надо прочитать заметку.
То есть, ситуация безвыходная.

Сергей
2015.06.05 09:33:51
#cid90672

Ответить

#cid90671,

#cid90666, Сергей

Это очень просто. Делается одной строкой.
Достаточно написать правильный шаблон, редирект и модификаторы для RewriteRule.
Но для этого надо прочитать заметку.
То есть, ситуация безвыходная.

Почитал.
Пробую так, не работает.
RewriteRule ^(.*)\{2,}$ $1 [R=301]

imen
2015.06.05 11:16:32
#cid90673

Ответить

#cid90672, Сергей

Пробую так, не работает.
RewriteRule ^(.*)\{2,}$ $1 [R=301]

Стесняюсь задать дежурный вопрос: «Опробованное "не работает" сопровождается какими-то сообщениями в журнал сервера?»

Сергей
2015.06.05 11:45:06
#cid90674

Ответить

#cid90673, imen

#cid90672, Сергей

Стесняюсь задать дежурный вопрос: «Опробованное "не работает" сопровождается какими-то сообщениями в журнал сервера?»

К логам сервера нету доступов, никаких ошибок на экран не выдаёт.

imen
2015.06.05 15:08:08
#cid90675

Ответить

#cid90674, Сергей

К логам сервера нету доступов

Так ты на _рабочем_ сервере _экспериментируешь_?…
Стенд (с полным доступом не только к журналам, но и к заданию уровня журналирования) не используешь по каким-то идейным соображениям (фрюниксы не требуют лицензионных отчислений)?

Сергей
2015.06.05 15:19:39
#cid90676

Ответить

#cid90675, imen

#cid90674, Сергей

Так ты на _рабочем_ сервере _экспериментируешь_?…
Стенд (с полным доступом не только к журналам, но и к заданию уровня журналирования) не используешь по каким-то идейным соображениям (фрюниксы не требуют лицензионных отчислений)?

Нет, в данной ситуации у меня нету к нему доступа.
Мне достаточно видеть ответ сервера. Не сочтите за рекламу http://www.majento.ru/index.php?page=seo-analize/check-server-request

2015.06.05 16:27:10
#cid90677

Ответить

#cid90676, Сергей

Нет, в данной ситуации у меня нету к нему доступа.

"Стенд" — это локальная копия твоего сайта на локальном же сервере, тестовый образец, на котором ставятся эксперименты.
То есть, ты не можешь не иметь к нему доступа, просто по определению.

Эксперименты над .htaccess можно ставить на голом апаче, даже сайт не нужен.

#cid90672, Сергей

Почитал.
Пробую так, не работает.
RewriteRule ^(.*)\{2,}$ $1 [R=301]

Плохо читал.
Взял и заэкранировал фигурную скобку.
Ну как такое будет работать?!

Сергей
2015.06.05 17:21:21
#cid90678

Ответить

#cid90677,

#cid90676, Сергей

"Стенд" — это локальная копия твоего сайта на локальном же сервере, тестовый образец, на котором ставятся эксперименты.
То есть, ты не можешь не иметь к нему доступа, просто по определению.

Эксперименты над .htaccess можно ставить на голом апаче, даже сайт не нужен.

#cid90672, Сергей

Плохо читал.
Взял и заэкранировал фигурную скобку.
Ну как такое будет работать?!

Всё это делается на рабочем сервере, к которому у меня только ФТП доступ.
Ок, убрал экранирование
RewriteRule ^(.*)/{2,}$ $1 [R=301] не работает
заэкранировал слеш
RewriteRule ^(.*)\/{2,}$ $1 [R=301] не работает

2015.06.06 01:48:11
#cid90679

Ответить

#cid90678, Сергей

Ну хорошо, возможно это действительно неочевидно.

Как настроить 301 редирект с site.ru/group/item////// на site.ru/group/item/ ?

Дело в том, что mod_rewrite работает не с урлами, а с путями на файловой системе. И в тот момент, когда RewriteRule сравнивает шаблон, который ты прописал, с файловым путём, который запрошен — он, этот путь, уже приведён сервером к нужному тебе виду.
Только без редиректа ты этого не увидишь.

То есть, когда ты вводишь в браузер адрес "site.ru/group/item//////", в RewriteRule для сравнения попадает что-то типа "/var/www/group/item/". А с директивой "RewriteBase /" — вообще "group/item/" (без слеша в начале, ведь это относительный путь).
Но в адресной строке остаётся всё тот же "site.ru/group/item//////"

RewriteRule ^(.*)/{2,}$ $1 [R=301] не работает

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

заэкранировал слеш
RewriteRule ^(.*)\/{2,}$ $1 [R=301] не работает

В шаблонах слеши не являются спецсимволами, поэтому экранировать их не надо. К ошибке не приведёт, просто лишнее.

Тебе нужно:
1) определить, есть ли в конце урла лишние слеши
2) если да — сделать тупой редирект уже исправленного сервером пути на себя же.

RewriteCond %{REQUEST_URI} /{2,}$
RewriteRule (.*) $1 [R=301,L]

Виктор
2015.07.13 15:30:47
#cid90771

Ответить

Доброго дня, подскажите есть ли возможность как то блокировать и отдавать 403 ошибку вот таким запросам: (+++++++++++++++++++++++++++++++++++Result:+%E8%F1%EF%EE%EB%FC%E7%EE%E2%E0%ED%FB+%E4%E0%ED%ED%FB%E5+xas_AI.txt;+%22%EE%E1%FA%FF%E2%EB%E5%ED%E8%E5%22;+%22%E4%E0%F2%FC+%EE%E1%FA%FF%E2%EB%E5%ED%E8%E5%22;+%E2%EE%F8%EB%E8;+%ED%E5+%ED%E0%F8%EB%EE%F1%FC+%F4%EE%F0%EC%FB+%E4%EB%FF+%F0%E0%E7%EC%E5%F9%E5%ED%E8%FF;+Result:+%E8%F1%EF%EE%EB%FC%E7%EE%E2%E0%ED%FB+%E4%E0%ED%ED%FB%E5+xas_AI.txt;+%22%EE%E1%FA%FF%E2%EB%E5%ED%E8%E5%22;+%22%E4%E0%F2%FC+%EE%E1%FA%FF%E2%EB%E5%ED%E8%E5%22;+%ED%E5+%ED%E0%F8%EB%EE%F1%FC+%F4%EE%F0%EC%FB+%E4%EB%FF+%F0%E0%E7%EC%E5%F9%E5%ED%E8%FF;+Result:+%F0%E5%F1%F3%F0%F1+%ED%E5+%F0%E0%E1%EE%F2%E0%E5%F2+/+%ED%E5+%F3%E4%E0%EB%EE%F1%FC+%EE%EF%F0%E5%E4%E5%EB%E8%F2%FC+IP) Как я понимаю это работа хрумера, не подскажите как правильно прописать правило чтобы блокировать это безобразие, своими силами пока не удалось решить это. Заранее спасибо.

2015.07.14 19:42:48
#cid90773

Ответить

#cid90771, Виктор

Доброго дня, подскажите есть ли возможность как то блокировать и отдавать 403 ошибку вот таким запросам:

Если в нормальных запросах не используются символы "+" или "%" — блокируй по ним.

А вообще запросы предназначаются движку, вот он и должен обрабатывать все подобные случаи.

Нуб
2015.07.15 01:01:59
#cid90774

Ответить

День добрый!
Пытаюсь убрать Itemid=516 в урле:
/index.php?option=com_comprofiler&view=confirm&confirmcode=reg641c95a946c023ce2755447a44c94fbf0670e245&Itemid=516

вставил такой редирект:
RewriteCond %{QUERY_STRING} ^(.*)Itemid=516$
RewriteRule ^(.*) /$1?%1 [R=301,L]

Itemid=516 он убрал, но и заменил все точки с запятой на %3b

index.php?option=com_comprofiler&%3bview=confirm&%3bconfirmcode=regb4a3c536b18f41a49ea5158d713fcee50670e246&%3b

а это не верно. Не подскажете почему лыжи не едут?

Нуб
2015.07.15 10:43:50
#cid90775

Ответить

#cid90774, Нуб

сорри не точки с запятой, а знак &

Нуб
2015.07.15 11:46:46
#cid90776

Ответить

ещё раз сорри, заработался...
изначальный урл
index.php?option=com_comprofiler&view=confirm&confirmcode=rege44a7da7fec0730fea51a824cd0c1d210670e247&Itemid=516
после моего редиректа выходит
index.php?option=com_comprofiler&%3bview=confirm&%3bconfirmcode=rege44a7da7fec0730fea51a824cd0c1d210670e247&%3b

пробовал заменять 3b% такой вот штукой
RewriteCond %{QUERY_STRING} (.*)(%3b)(.*)
RewriteRule ^%3b %1;%2? [R=301,L]
но до лампочки...

2015.07.15 15:58:41
#cid90777

Ответить

#cid90774, Нуб

Не подскажете почему лыжи не едут?

После твоего редиректа движок делает свой собственный, при этом экранирует спецсимволы в запросе.
Видимо, для движка по какой-то причине важно, чтобы "Itemid" присутствовал.
Это единственное объяснение.

Нуб
2015.07.15 16:26:11
#cid90778

Ответить

#cid90777,

#cid90774, Нуб

После твоего редиректа движок делает свой собственный, при этом экранирует спецсимволы в запросе.
Видимо, для движка по какой-то причине важно, чтобы "Itemid" присутствовал.
Это единственное объяснение.

дык без itemid страница грузится как раз как мне нужно. А можно ли как нибудь заменить %3b на ; (точку с запятой)

2015.07.15 19:18:50
#cid90779

Ответить

#cid90778, Нуб

Можно, но это будет борьба с последствиями, а не с причиной.
Плюс — куча лишних бесполезных редиректов и падение производительности.
Вобщем, не надо так делать.

imen
2015.07.16 16:55:09
#cid90782

Ответить

#cid90771, Виктор

… Как я понимаю это работа хрумера, не подскажите как правильно прописать правило чтобы блокировать это безобразие, своими силами пока не удалось решить это. Заранее спасибо.

К приведённому ответу добавлю, что скрытые (невидимые реальному пользователю) формы хорошо помогают в решении задачи идентификации роботов.

А вообще эта задача не для mod_rewrite, а скорее для * www-apache/mod_security

Homepage: http://www.modsecurity.org/
Description: Web application firewall and Intrusion Detection System for Apache

P.S. Только ошибку такого рода товарищам я бы отдавал не 403-ю, а 402-ю ☺

Виктор
2015.07.19 13:56:15
#cid90806

Ответить

#cid90782, imen

#cid90771, Виктор

К приведённому ответу добавлю, что скрытые (невидимые реальному пользователю) формы хорошо помогают в решении задачи идентификации роботов.

А вообще эта задача не для mod_rewrite, а скорее для * www-apache/mod_security

P.S. Только ошибку такого рода товарищам я бы отдавал не 403-ю, а 402-ю ☺

У меня виртуальный хостинг, поэтому нет возможности устанавливать дополнительные расширения для апача, не могли бы Вы подсказать правильное правило для блокировки по запросам начинающимися со спецсимвола "+" я уже всю голову сломал и ничего не выходит. Хрумер конечно не пробивает, так как Вы писали есть скрытые поля для определения роботов и им отдается 404 ошибка, но хотелось бы правило прописать чтобы сразу отсекало на 403. Подскажете?

2015.07.20 02:45:29
#cid90807

Ответить

#cid90806, Виктор

правильное правило для блокировки по запросам начинающимися со спецсимвола "+"

RewriteCond %{QUERY_STRING} ^\+

я уже всю голову сломал и ничего не выходит.

Это очень простое правило.

Алекс
2015.07.23 16:03:15
#cid90816

Ответить

Ребят, подскажите, пожалуйста, как выполнить такой редирект через htaccess:
Если у пользователя нет utm_term в урле - редиректим пользователя на тот же урл, добавляя "&utm_term=XXX", где XXX - числло от 1 до 7.

2015.07.23 20:34:36
#cid90820

Ответить

#cid90816, Алекс

где XXX - числло от 1 до 7.

С этого момента поподробнее, пожалуйста.

Произвольное число?

Алекс
2015.07.29 13:29:47
#cid90839

Ответить

#cid90820,

#cid90816, Алекс

С этого момента поподробнее, пожалуйста.

Произвольное число?

Да, рандомное число от 1 до 7. Например site.ru?utm_term=5

2015.07.29 15:45:05
#cid90841

Ответить

#cid90839, Алекс

Да, рандомное число от 1 до 7. Например site.ru?utm_term=5

В htaccess нет генератора случайных чисел.
Используй скрипты.

Klim
2015.08.24 10:14:40
#cid90906

Ответить

Добрый день!
Пытаюсь сделать редирект со страниц типа site.ru/razdel/podrazdel1/podrazdel2 на site.ru/podrazdel2 и site.ru/razdel/podrazdel1/podrazdel2/tovar.html на site.ru/tovar.html Если сказать по простому то необходимо сделать короткий адрес.
Догадываюсь, что необходимо исключить любые переменные, которые находятся между слешем после домена и последним перед товаром или разделом. Подскажите, как такое можно реализовать?
Заранее спасибо!

sib
2015.09.03 07:28:55
#cid90937

Ответить

Доброго дня.
Прошу подсказать как сделать сие.
У Вордпресса имеется такой баг или фича.
если в конце статьи сайт.ру/статья/ вставить любую цифру или несколько типа сайт.ру/статья/21546 то мы попадаем на эту же статью но с урлом сайт.ру/статья/21546

причем при добавлении любого символа в сайт.ру/статья/215b46 корректно отдается 404 страницы.

Подскажите как при условии /любой набор цифр и /любой набор цифр/ сделать редирект на статью?

Олег
2015.09.22 23:48:12
#cid90981

Ответить

Добрый день!

Подскажите как заменить заглавные символы на строчные в урлах?

Есть такой скрипт, но он почему то не работает:

RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]
# Пропустить всю секцию, если в ссылке нет больших букв
RewriteRule ![A-Z] - [S=28]
# Заменить один символ A-Z на соответствующий символ a-z, и перейти к следующему правилу
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2
# Если есть ещё большие буквы — начать обход с самого начала
RewriteRule [A-Z] - [N]
RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]

2015.09.23 04:39:13
#cid90982

Ответить

#cid90981, Олег

Подскажите как заменить заглавные символы на строчные в урлах?

Хочешь избавиться от приятной и полезной особенности регистрозависимых ФС, поиметь геморрой с экранированными символами типа %2F, а заодно убить статистику сайта для роботов?
Не вопрос, я помогу.

Если есть доступ к настройкам сервера — используй RewriteMap
http://httpd.apache.org/docs/trunk/rewrite/rewritemap.html

Если у сайта стандартный движок с одной точкой входа типа index.php — делай редирект из неё, предварительно поменяв регистр на нижний. Из скрипта это делать гораздо удобнее.

Если ни то ни другое — сделай искусственную точку входа сам:
RewriteRule [A-Z] lowercase.php [L]

Есть такой скрипт, но он почему то не работает:

А такое пихать в htaccess не надо, он для этого не предназначен.

Евгений
2015.09.24 23:59:25
#cid90988

Ответить

Сайт переезжает с конструктора wix на standalone

У wix урл внутренней страницы формируется следующим образом
http://site.ru/#!baget/c23rp
У нового сайта вот так
http://site.ru/uslugi/oformlenie-v-baget.html

Redirect 301 /#!baget/c23rp http://site.ru/uslugi/oformlenie-v-baget.html

Не срабатывает, пробовал экранировать, пробовал ставить (.*) вместо решётки

Молю о помощи перерыл весь инет

2015.09.25 16:48:51
#cid90990

Ответить

#cid90988, Евгений

http://site.ru/#!baget/c23rp

Всё, что после диеза (решётки) — это якорь. Он не передаётся в запросе HTTP, поэтому сервер ничего о нём не знает. По сути, он даже не является частью урла.
Якорь — это указание для браузера, и обрабатывается он только браузером.

При переходе по этой ссылке серверу будет послан запрос "http://site.ru/" ("GET / HTTP/1.x" для хоста "site.ru").
В ответ сервер выдаст блок данных — страницу сайта, которая попадёт в браузер для обработки.
В процессе обработки браузер применит якорь "!baget/c23rp".
Вот так оно работает.

Redirect 301 /#!baget/c23rp http://site.ru/uslugi/oformlenie-v-baget.html

Такой редирект можно сделать только с помощью жаваскрипта (ну, или любой другой приблудой, которая обрабатывается браузером. Из которых жаваскрипт самый доступный и популярный).

Александр
2015.10.18 17:12:29
#cid91041

Ответить

Я использовал .htaccess для замены url в адресной строке, чтобы склеить синонимы. Вместо "www.mysite.ru" -> "mysite.ru" или "www.mysite.ru/статьи" -> "mysite.ru/статьи".

Однако, когда я попробовал приклеить к сайту домен на кириллице (русскоязычный) "мойсайт.рф", то выходит, что правило в .htaccess заменяет только адреса с вложенными ресурсами типа "мойсайт.рф/статьи" -> "mysite.ru/статьи", а если идёт чисто домен "мойсайт.рф" то ничего не меняется?

В чём может быть дело?

#Options +FollowSymlinks
RewriteEngine On
RewriteBase /

# Fix Apache internal dummy connections from breaking [(site_url)] cache
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]

# Домены с кириллицей переведён в punycode
# мойсайт.рф -> xn--80arbjktj.xn--p1ai
RewriteCond %{HTTP_HOST} (xn--80arbjktj.xn--p1ai)
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ http://mysite.ru/$1 [R=301,L]

Буду благодарен за совет.

Новичок
2015.12.20 17:14:58
#cid91217

Ответить

Здравствуйте! Подскажите, пожалуйста, такой момент.
Есть файл .htaccess с таким содержанием:

ErrorDocument 404 /
AddDefaultCharset utf-8
RewriteEngine On

RewriteCond %{HTTP_HOST} ^(.+).site.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301,L]

RewriteRule ^category1/?(\d*)?/$ index.php?act=category1&page_num=$1 [L]
RewriteRule ^category1/([^/]+)\.html index.php?act=category1-soderzhanie&key=$1 [L]

RewriteRule ^category2/?(\d*)?/$ index.php?act=category2-list&page_num=$1 [L]
RewriteRule ^category2/sub-category2/$ index.php?act=category2-sub-category2 [L]
RewriteRule ^category2/([^/]+)\.html index.php?act=category2-soderzhanie&key=$1 [L]

RewriteRule ^category3/$ index.php?act=category3 [L]

RewriteRule ^category4/?(\d*)?/$ index.php?act=category4&page_num=$1 [L]

RewriteRule ^([^/]+)/$ index.php?act=category4-soderzhanie&key=$1 [L]

Теперь если мы вводим в адресную строку любую категорию:
site.com/category1/ или site.com/category2/ ... site.com/category4/ - все открывается правильно.

Но стоит нам ввести вместо или вместе с /category1/ набор цифр-букв:
site.com/cateцифрыбуквы123gory1/ - мы получаем на экран сообщение:

Warning: Cannot modify header information - headers already sent by (output started at путь.../.../файл.php:1) in путь.../.../index.php on line 123

Можно этого избежать, если в строке:
RewriteRule ^([^/]+)/$ index.php?act=category4-soderzhanie&key=$1 [L]

добавить вместо "/" в конце окончание "\.html", то есть сделать такой вид:
RewriteRule ^([^/]+)\.html index.php?act=category4-soderzhanie&key=$1 [L]
Тогда если вместо "category1...4" писать бред, происходит редирект на главную, что нам и нужно.

Но тогда страницы раздела "category4" будут заканчиваться на .html, а нужно чтобы они заканчивались на "/".

То есть нужно чтобы вместо вывода на экран голой страницы с указанной выше ошибкой происходил редирект на главную.
Чтобы при неправильном написании URL (написании несуществующего URL) нас редиректило на главную.
Как можно решить данную проблему?

Кстати, если делать ошибки в части ссылки "soderzhanie.html", то есть:
site.com/category1/soderzhanie.html - верное написание
site.com/category1/sodeцифрыбуквы123rzhanie.html - неверное написание
То при неверном написании второй части ссылки у нас та же самая ошибка и нужен так же редирект на главную.

Юрий
2015.12.22 16:01:56
#cid91245

Ответить

Здравствуйте.
Имеем

RewriteEngine On

RewriteRule keyword http://www.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [L,R=301]

1 - RewriteRule keyword http://www.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [L,R=301]
Возникает зациклинность и соответственно Неверное перенаправление на странице.
2 - RewriteRule ^keyword$ http://www.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [L,R=301]
Редиректит почти всё где встречается слово keyword, но не работает если в ссылке имеется нижнее подчёркивание до/после входного слова.
Не работает если после кей слова идут ещё символы. тоесть gde-kupit-keyword перекинет на gde-kupit-saiding_keyword, а gde-kupit-saiding_keyword-asd не пашет как и с qwe-keyword-qwe.

Как написать правильно чтобы при наличие в ссылке кий слова редиректило на gde-kupit-saiding_keyword?

2015.12.22 17:51:48
#cid91250

Ответить

#cid91217, Новичок

Но стоит нам ввести вместо или вместе с /category1/ набор цифр-букв:
site.com/cateцифрыбуквы123gory1/ - мы получаем на экран сообщение:

Warning: Cannot modify header information - headers already sent by (output started at путь.../.../файл.php:1) in путь.../.../index.php on line 123

Надо пилить движок.

2015.12.22 17:58:18
#cid91251

Ответить

#cid91245, Юрий

1 - RewriteRule keyword http://www.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [L,R=301]
Возникает зациклинность и соответственно Неверное перенаправление на странице.

Если содержимое адресной строки некритично — убери "R=301".

2 - RewriteRule ^keyword$ http://www.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [L,R=301]
Редиректит почти всё где встречается слово keyword

Это ненормальное поведение. Должно редиректить только "http://www.мой-сайт.ru/keyword".
Надо смотреть настройки сервера, что там за модуль и как он работает вообще.
И нет ли конфликтов с редиректами из движка.

Андрей
2016.01.18 15:37:08
#cid91314

Ответить

Доброго всем времени суток.
Такая ситуация:
есть домен 2-ого уровня mysite.com
все домены 3-его уровня *.mysite.com отправляются на один .htaccess

1) необходимо, чтобы все домены 3-его уровня передавались как параметр, не изменяя строку для пользователя, то есть
domain1.mysite.com передавался как www.mysite.com/?domainname=domain1, но пользователь видел domain1.mysite.com
2) все остальные параметры должны оставаться и передаваться без изменений domain1.mysite.com/?param=123 -> www.mysite.com/?domainname=domain1¶m=123
3) чтобы физически все домены 3-его уровня ссылались на определенную папку "alldomains", как home-директорию (у всех доменов, одна папка, кроме домена "www") папка "alldomains" может быть в home-директории общего сайта mysite.com, может находится на уровень выше, например, не принципиально.
4) у доменов третьего уровня должны работать поддиректории, то есть domain1.mysite.com/somedir/?param=123 -> www.mysite.com/somedir/?domainname=domain1¶m=123 (директория "somedir" физически лежит в "alldomains"), а www.mysite.com/somedir/?param=123 -> www.mysite.com/somedir/?param=123
5) если общая папка для доменов 3-его уровня "alldomains", лежит в общей директории, то при запросе этой папки через общий домен www.mysite.com должна выдаваться 404 ошибка.
6) домен www.mysite.com должен работать со общей директорий сайта mysite.com
7) домен mysite.com должен редиректится на www.mysite.com с заменой имени сайта в строке браузера.

Перерыл весь инет и этот сайт, что получилось:
1, 2, 6, 7 пункты работают
с 4 понимаю что надо использовать {REQUEST_URI}, но что-то у меня то "лапы ломит, то хвост отваливается". Одно начинает работать, другое перестает.

.htaccess:
ErrorDocument 404 /404.php

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^mysite.com
RewriteRule (.*) http://www.mysite.com/$1 [L,R=301]

RewriteCond %{HTTP_HOST} ^([^\.]+)\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.mysite\.com(.*)$ [NC]
RewriteRule ^(.*)$ index.php?domainname=%1%2 [L,QSA]

Извиняюсь, если что-то не очень понятно объяснил.
Заранее спасибо за помощь.

Андрей
2016.01.18 17:56:54
#cid91316

Ответить

#cid91314, Андрей

4) у доменов третьего уровня должны работать поддиректории, то есть domain1.mysite.com/somedir/?param=123 -> www.mysite.com/somedir/?domainname=domain1¶m=123 (директория "somedir" физически лежит в "alldomains"), а www.mysite.com/somedir/?param=123 -> www.mysite.com/somedir/?param=123

вроде решил и 4 пункт. Остался 5-й

ErrorDocument 404 /404.php

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^mysite.com
RewriteRule (.*) www.mysite.com/$1 [L,R=301]

RewriteCond %{HTTP_HOST} ^([^\.]+)\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.mysite\.com(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^/alldomains
RewriteRule ^(.*)$ /alldomains%{REQUEST_URI}index.php?name=%1%2 [L,QSA]

Андрей
2016.01.18 20:16:10
#cid91317

Ответить

Вопрос вдогонку.
Как заставить отрабатывать запросы 404 для доменов 3-его уровня? Обычный ErrorDocument 404 /404.php работает при данных настройках только для www.

Ярослав
2016.01.23 15:22:50
#cid91328

Ответить

Не могу наладить редирект с HTTP на HTTPS

.htaccess

RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

и

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !^index\.php$
RewriteRule ^(.+)$ /index.php [L]

с друг другом конфликтуют
но без второго блока не работают ссылки типа site.ru/contacts

А мне нужно включить постоянный редирект с http на https Подскажите пожалуйста.

Александр
2016.06.13 00:08:00
#cid91577

Ответить

Всем привет! Ребята, подскажите пожалуйста, как сделать правильный 301 редирект:

/video/ID-video/text/ или /video/ID-video/text.html или /video/ID-video/text
ID-video - оно меняется ...
на /video/ID-video всё после ID-video убрать, как бы оно не выглядело.... и слеш также! Что бы оставалось чисто /video/ID-video

Заранее благодарен за помощь, с уважением, Александр.

2016.06.13 15:37:40
#cid91578

Ответить

#cid91577, Александр

Всем привет! Ребята, подскажите пожалуйста, как сделать правильный 301 редирект:

/video/ID-video/text/ или /video/ID-video/text.html или /video/ID-video/text
ID-video - оно меняется ...
на /video/ID-video всё после ID-video убрать, как бы оно не выглядело.... и слеш также! Что бы оставалось чисто /video/ID-video

Заранее благодарен за помощь, с уважением, Александр.

Было в комменатриях.

Проверяешь урл и запоминаешь второй каталог (ID-video), потом делаешь перенаправление на него.
Типа того (пишу наобум, без проверки):
RewriteRule ^video/([^/]+)/.*$ /$1 [L,R=301]

Александр
2016.06.13 21:04:25
#cid91581

Ответить

#cid91578,

#cid91577, Александр

Было в комменатриях.

Проверяешь урл и запоминаешь второй каталог (ID-video), потом делаешь перенаправление на него.
Типа того (пишу наобум, без проверки):
RewriteRule ^video/([^/]+)/.*$ /$1 [L,R=301]

Спасибо большое, но выдаёт не /video/ID-video , а /ID-video
Дописывание RewriteRule ^video/([^/]+)/.*$ /video/$1 [L,R=301] не помогло, всё-равно в итоге /ID-video

p.s. В комментах, именно такого решения, не нашёл, поэтому и обратился.....

2016.06.14 00:02:37
#cid91582

Ответить

#cid91581, Александр

Спасибо большое, но выдаёт не /video/ID-video , а /ID-video

Да, конечно же "video/$1", но для надёжности можно и так:

RewriteRule ^video/([^/]+)/.*$ http://site.dom/video/$1 [L,R=301]

Дописывание ... не помогло

Быть такого не может. Или не сохранил, или неправильно дописал.

p.s. В комментах, именно такого решения, не нашёл, поэтому и обратился.....

Дык точно такого же и быть не могло, но по элементам это всё разбиралось и неоднократно.

Александр
2016.06.14 08:49:24
#cid91583

Ответить

#cid91582,

#cid91581, Александр

Да, конечно же "video/$1", но для надёжности можно и так:

RewriteRule ^video/([^/]+)/.*$ http://site.dom/video/$1 [L,R=301]

Быть такого не может. Или не сохранил, или неправильно дописал.

Дык точно такого же и быть не могло, но по элементам это всё разбиралось и неоднократно.

Так заработало: RewriteRule ^video/([^/]+)/.*$ http://site.dom/video/$1 [L,R=301]

| Быть такого не может. Или не сохранил, или неправильно дописал.
Может и не сохранил, но редирект былЮ просто с вырезанием /video/

| но по элементам это всё разбиралось и неоднократно.

Мне это ни о чём не говорит, я в этом не разбераюсь, просто попросил помощи ...

Спасибо большое за помощь, проблема решена!

Мира
2016.06.24 02:56:39
#cid91593

Ответить

Доброе время суток. Может быть вы сможете мне подсказать.. Был заброшенный сайт на Jommla (основная информация переехала на другой сайт). В какой-то момент было решено вернуть все на старый адрес. Информация, что была в остатках на сайте — не являлась ценной, и в связи с чем, все было потерто и была установлена актуальная версия Jommla. Через какое-то время выяснилось, что новые статьи сайта доступны по старым адресам — в зависимости от id статьи. То есть — если id в конце старого адреса совпадает с id в конце нового адреса — то материал становится доступен по 2-м адресам. Отключала перенаправление в настройках движка, но результата это не принесло. как можно запретить Jommla делать такие редиректы на основе одинакового id материала? Благодарю за любой ответ.

Vadim
2016.09.09 13:55:37
#cid91661

Ответить

просьба помочь, у меня дубли главной выводятся по типу http://www.it-simple.ru/?p=2109 и вместо 2109 можно поставить любое число и будет главная страница (дублей бесконечное множество). И даже если просто http://www.it-simple.ru/? откроется главная. Сайт на джумла 3,6. настроено ЧПУ.

2016.09.11 01:32:03
#cid91668

Ответить

#cid91661, Vadim

Всё, что после знака вопроса в урле — это QUERY_STRING, указания для скриптовой части.
Похоже, движок её просто не отрабатывает.

Vadim
2016.09.12 10:39:49
#cid91669

Ответить

спасибо #cid91668 за оперативный ответ,

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

imen
2016.09.13 12:37:33
#cid91671

Ответить

#cid91669, Vadim

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

Что в этом плохого?
Твой опыт ещё не подсказывает, что коллективный гугель скорее является рассадником ересей и кладбищем популярных вопросов (без ответов), нежели источником информации?

Рисуй описание (помня, что правильно сформулированный вопрос содержит бОльшую часть ответа), можно посмотреть.

And
2016.11.01 14:48:09
#cid91702

Ответить

Здравствуйте!
Есть такие адреса
site.ru/property-feature/balkony/?view=grid
site.ru/property-feature/banya-sauna/?view=list
site.ru/property-feature/detskaya-ploshhadka/?view=list
site.ru/property-feature/klimat-kontrol/?view=grid
site.ru/property-feature/klimat-kontrol/?view=list
site.ru/property-feature/parkovka/?view=grid
site.ru/property-feature/pitanie-2/?view=grid
site.ru/property-feature/pitanie-2/?view=list
site.ru/property-feature/s-zhivotnymi/?view=grid
site.ru/property-feature/sejf/?view=grid
site.ru/property-feature/stoyanka/?view=list
site.ru/property-feature/televizor/?view=list
site.ru/property-feature/transfer/?view=grid
site.ru/property-feature/xolodilnik/?view=grid
site.ru/property-feature/

Надо сделать переадресацию на http://site.ru/catalog/
cms bitrix

Гость
2016.11.28 21:10:40
#cid91713

Ответить

#cid91702, And

Здравствуйте!
Есть такие адреса
site.ru/property-feature/balkony/?view=grid
site.ru/property-feature/banya-sauna/?view=list
site.ru/property-feature/detskaya-ploshhadka/?view=list
site.ru/property-feature/klimat-kontrol/?view=grid
site.ru/property-feature/klimat-kontrol/?view=list
site.ru/property-feature/parkovka/?view=grid
site.ru/property-feature/pitanie-2/?view=grid
site.ru/property-feature/pitanie-2/?view=list
site.ru/property-feature/s-zhivotnymi/?view=grid
site.ru/property-feature/sejf/?view=grid
site.ru/property-feature/stoyanka/?view=list
site.ru/property-feature/televizor/?view=list
site.ru/property-feature/transfer/?view=grid
site.ru/property-feature/xolodilnik/?view=grid
site.ru/property-feature/

Надо сделать переадресацию на http://site.ru/catalog/
cms bitrix

очень плохо что админ сайта, куда-то потерялся

2016.11.28 21:47:10
#cid91714

Ответить

#cid91713, Гость

очень плохо что админ сайта, куда-то потерялся

Да тут я.
Просто проблема неинтересная, все подсказки давно в заметке и комментариях.

Гость
2016.11.30 14:05:47
#cid91715

Ответить

#cid91714,

#cid91713, Гость

Да тут я.
Просто проблема неинтересная, все подсказки давно в заметке и комментариях.

я пробовал довольно много вариантов что указаны вами и другими участниками ошибка 503 или циклическая

Дэн
2017.01.30 10:21:46
#cid91742

Ответить

Привет.
Как преобразовать пиратские входящие ссылки вида http://site.com/pages.php%3Fcid%3D142 в нормальный вид http://site.com/pages.php?cid=142
По сути как заменить последовательности "%3F" на "?" и "%3D" на "="? внутри url с помощью htaccess. Никак не получается...

praschur
2017.03.23 18:40:15
#cid91786

Ответить

доброго времени суток!
надеюсь, заинтересовать своей проблемкой. :)
суть в следующем (построчно вывожу свой .htaccess в последней версии):

Options +FollowSymLinks
//no commtnts. без этого не работает ничего.
ErrorDocument 404 http//mysite.ru/?name=_404
//эта директива не работает ни при каком раскладе. то есть, вызванная из командной строки исправно и корректно отображается, а при эмуляции ошибки - них... (что отображается - чуть ниже)
RewriteEngine On
RewriteBase /
//без этого никак...
RewriteCond %{HTTP_HOST} ^www.mysite.ru\.ru$ [NC]
RewriteRule ^(.*)$ http://mysite.ru/$1 [R=301,L]
//стандартный перевод с www на без оного
RewriteRule ^/.htaccess$ - [G]
//...и это понятно...
RewriteCond %(REQUEST_URI) ^(([.*]+\/)*[^.]+)?$
RewriteRule ^(.*)$ index.php [L]
//а здесь и основной затык. ну, не хочет реквест_юри убираться из строки запроса!

поясню: все мои ссылки - квери_стринг.
то есть, по логике запрос хттп://мусите.ру/папка/файл.хтмл должен вызывать либо еррор 404 (с заготовленной страницей) либо (поскольку директива еррордокумент не работает) обнулять реквест_юри и выдавать нормальную стартовую страницу.
выдаёт действительно стартовую, только безо всякого оформления ("слетает" стайл.ксс) и при наведении мыши на ссылки из меню предлагает переход на (к примеру) хттп://мусите.ру/папка/файл.хтмл?наме=название&нум=000 (вместо /индекс.пхп?наме=название&нум=000).
я из-за этого отказался от человекоподобных урлов (чпу) - оформление слетало при любом запросе со слешами...
если что - сайт самописный.
хатеекцесс переписывался многократно. пробовались многие варианты (как с проверкой существования файлов и каталогов, так и без неё). переписывались также (и не единожды) конфигурационные файлы...

заранее благодарен. хотя бы за прочтение...

Павел
2017.05.26 23:35:37
#cid91853

Ответить

Добрый вечер.

Такой вопрос.
В htaccess есть несколько редиректов вида:

Redirect 301 /statya1.html http://www.site.ru/statya.php?st=1
Redirect 301 /statya2.html http://www.site.ru/statya.php?st=2
...
Redirect 301 /statya10.html http://www.site.ru/statya.php?st=10

Сейчас выяснилось , что редиректов такого вида нужно прописать значительно больше, но я даже не представляю сколько таких файлов (вида statyaN.html, где N - натуральное число) всего (но точно больше ста).
Как это прописать с помощью регулярных выражений?

Ну т.е. это по смыслу должно выглядеть так:

Redirect 301 /statyaN.html http://www.site.ru/statya.php?st=N , где N - натуральное число

А как это прописать в htaccess?
спасибо.

Tor
2017.06.12 10:05:37
#cid91862

Ответить

Здравствуйте.
Помогите пожалуйста, как правильно написать редирект на страницу 404.
мне надо, что бы перенаправлялись все url которые после category/ начинаются цифрами

пример - domains.ru / category / 456465 => domains.ru / 404

Пробовал такой код
RewriteEngine On
RewriteCond %{QUERY_STRING} category/ +d [NC]
RewriteRule domains.ru/404 [R=301,L]

и такой
RewriteEngine On
RewriteRule domains.ru/category/\d - [L,R=404]

но нечего не работает.
Подскажите, что я делаю не так.
За ранее большое спасибо.

бармас
2017.08.06 02:23:53
#cid91897

Ответить

Есть вот такая регулярка в htacess
RewriteRule ^(.+)(\s|_)(.+)$ /$1-$3 [R=301,L]
Она заменяет знаки _ на - .
Но проблема в том , что в строке много подчеркиваний и получапется куча редиректов и как правило после 4-5 ужа сваливается.
НЕ подскажете как за один проход все символы _ заменить на - , типа как str_replace в php

Виктор
2017.09.25 01:40:26
#cid91924

Ответить

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

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) http://www.site.ru/$1/ [R=301,L]

RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,L] # удаляет index.php #

RewriteCond %{QUERY_STRING} ^(.*)?_openstat=
RewriteRule (.*) http://%{HTTP_HOST}/$1?%1 [R=301,L] # убираем все после знака ?#

RewriteCond %{QUERY_STRING} ^(.*)?utm_source=
RewriteRule (.*) http://%{HTTP_HOST}/$1?%1 [R=301,L] # убираем все после знака ?#

ErrorDocument 404 /404/

RewriteBase /

Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L] # редирект на www #

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /main\.php\ HTTP/
RewriteRule ^main\.php$ http://www.site.ru/ [R=301,L] # склейка индексной страницы с корнем сайта #

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm?)\ HTTP/
RewriteRule ^ http://www.site.ru/ [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php/|html/|htm?)\ HTTP/
RewriteRule ^ http://www.site.ru/ [R=301,L]

RewriteRule ^([0-9a-z_\-]+)\/$ /index.php?page=$1

php_flag register_globals off
php_flag magic_quotes_gpc off
php_flag display_errors off

Дмитрий
2018.01.07 00:33:01
#cid91982

Ответить

Друзья, и мне бы не помешал взгляд профессионала на мой код. Всё ли в порядке?

AddDefaultCharset UTF-8
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?%{QUERY_STRING} [L]
RewriteCond %{HTTP_USER_AGENT} (DomainCrawler|ltx71|AhrefsBot|SolomonoBot|SearchBot|MJ12bot|DotBot|CCBot|Site-Shot|TOBBOT|trendictionbot|statdom.ru|seranking_audit_bot) [NC]
RewriteRule .* - [F,L]

#
#SecFilterEngine Off
#SecFilterScanPOST Off
#
#
#SecFilterEngine Off
#SecFilterScanPOST Off
#
#
#SecFilterEngine Off
#SecFilterScanPOST Off
#

## USER IP BANNING

order allow,deny
deny from 62.122.182.106
deny from 178.127.147.228
deny from 178.127.215.27
deny from 80.252.154.233
deny from 185.6.8.9
allow from all

Михаил
2018.01.12 22:36:36
#cid91984

Ответить

Каким образом можно сделать редирект всех страниц типа
/click.php_id=602_from=139_to=42_url=1.html

на

click.php?id=602&from=139&to=42&url=1

imen
2019.03.04 15:34:16
#cid92139

Ответить

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

Есть проект «project», реализованный по принципу общей точки входа.

В реальном режиме корень указывает на /var/www/project/htdocs, перенаправление прописано в конфиге сервера и всё замечательно работает.
Проект сопровождает несколько разработчиков.
Каждому организована песочница посредством mod_userdir. Но уже без заморочек с статическими перенаправлениями, зато с разрешённым .htaccess.

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

RewriteEngine On
RewriteBase "/~user/project/htdocs"
RewriteCond %{REQUEST_URI} !(index\.php)$
RewriteRule "^$" "/~user/project/htdocs/root.php?q=$1" [QSA]

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

При попытке прописать в .htaccess следующее значение RewriteBase:

RewriteBase "%{CONTEXT_PREFIX}/project/htdocs"

Получается следующая ошибка (из error.log «сайта», в недра вопроса о журналировании userdir пока не зарываюсь):

[Mon Mar 04 15:13:27.375798 2019] [core:alert] [pid 24474] [client 192.168.100.128:39726] /home/user/public_html/project/htdocs/.htaccess: RewriteBase: argument is not a valid URL, referer: https://www.domain.tld/~user/

Re
2019.06.18 08:53:48
#cid92210

Ответить

Здравствуйте! Помогите разобраться пожалуйста.
Задача:
Добавлять к URL параметр ?cur=RUB если в урле присутствует /ru/ и ?cur=USD если /en/. У самого получилось сделать, но как-то криво видать, так как с переадресацией товар перестает добавляться в корзину WooCommerce:(

shinkareff
2020.04.22 02:05:53
#cid92311

Ответить

Образовалось множество несуществующих адресов, вида:
https://www.shinkareff.ru/page/9/?area=1&p=news&newsid=438
https://www.shinkareff.ru/page/9/?showfile=1&fid=55&p=downloads&area=1&categ=25
https://www.shinkareff.ru/page/9/?p=user&id=229&area=1
https://www.shinkareff.ru/page/9/?type=interview&area=1&p=articles&id=16
https://www.shinkareff.ru/page/9/?p=contact&area=1
https://www.shinkareff.ru/page/9/?p=misc&do=autowords&id=2

Необходимо убрать всё после завершающего слеша: знак вопроса и прочее.

Использовал правило, рекомендованное в статье. Сайт уходит в бесконечный редирект. Сайт на ВордПресс, работает ЧПУ (названия публикаций). Подскажите, что прописать, чтобы убрать мусор из адресов?

2020.04.23 03:24:52
#cid92312

Ответить

#cid92311, shinkareff

Использовал правило, рекомендованное в статье. Сайт уходит в бесконечный редирект. Сайт на ВордПресс, работает ЧПУ (названия публикаций). Подскажите, что прописать, чтобы убрать мусор из адресов?

Вордпресс использует переадресацию на index.php, а уже позже обрабатывает как изначальный урл, так и переданные параметры GET (то, что в адресной строке после знака вопроса). Причём в настройках вордпресса можно указать правила формирования урлов, то есть он умеет и GET, и виртуальные каталоги. Что неизбежно вступит в конфликт с "ручными" правилами переадресации.

В общем, надо внимательно разобраться с вордпрессом. Бесконечная переадресация может быть связана с двойной обработкой запросов.

shinkareff
2020.04.23 14:46:12
#cid92313

Ответить

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

В итоге, я серьезно занялся поиском дублей на своём сайте, и теперь работы ещё прибавилось — с постами, статьями, страницами вложений. Без проблем обрабатываются только запросы к главной и типы публикаций.

Александр
2020.11.21 20:54:55
#cid92363

Ответить

Прошу помощь!!

На сайте внутренние ссылки прописаны с символом "+". А по факту в названиях папок - пробелы. Как заменить "+" на "%20"?

Поясню))

Сейчас страницы нормально открываются так - www.site.ru/article title/ (ну или www.site.ru/article%20title/ )

А во внутренней перелинковке в ссылках - www.site.ru/article+title/

И как заменить этот "плюс" на "пробел" ?

Заранее огромное спасибо!!

Андрей
2021.03.25 02:18:32
#cid92384

Ответить

На сайт есть заходы из Facebook. Часть заходов - это реальные пользователи, часть - боты. Пользователи заходят по ссылке, которая содержит конструкцию ?fbclid= таких надо пропустить, а всем остальным именно с FB запретить. Как написать соответствующие регулярные выражения?

Настя
2022.09.06 11:37:18
#cid92486

Ответить

Добрый день!
Помогите разобраться, пожалуйста.
Делаю в htaccess редирект всех без исключения GET-запросов

RewriteCond %{QUERY_STRING} ^([a-z]|[0-9]) [NC]
RewriteRule ^(.*)$ /$1? [R=301,L]

Работает замечательно, но есть необходимость добавить исключение.
Т.е. убирать из URL все get-параметры, кроме одного:
?page=

imen
2024.04.16 16:20:10
#cid102263

Ответить

Рег.выры штука конечно хорошая…
Но тему переменных тоже хотелось бы раскрыть.

Есть web-сервер, на котором посредством mod_userdir выделены индивидуальные полянки для разработчиков.
И есть интерес нарисовать универсальный .htaccess.

На заборах https://serverfault.com/questions/554423/apache2-mod-rewrite-userdir пишут (что вполне подтверждается моим опытом):

RewriteBase /~username/

Но когда я пробую писать:

RewriteBase "%{CONTEXT_PREFIX}/projectname"

то получаю 500-ю ошибку сервера.

imen
2024.04.16 16:28:52
#cid102264

Ответить

Спрашивал и отвечаю.

RewriteBase как минимум в Apache 2.4 не обязателен.

А в

RewriteRule "^$" "%{CONTEXT_PREFIX}/project/index.php?q=$1" [QSA]

переменная замечательно интерпретируется.

Подсказка: https://web-answers.ru/php/mod-rewrite-dlja-raboty-s-drugim-serverom-i.html