чтоб обрабатывалось и
http://site.ru/ru
сделайте так
RewriteCond %{ENV:REDIRECT_RWR} ^yes$RewriteRule .* - [L]RewriteRule ^(.*)ru/(.*)$ $1/$2 [R=301,L,E=RWR:yes]RewriteRule ^ru$ http://%{HTTP_HOST}/ [R=301,L,E=RWR:yes]
Если у Вас нет реального каталога /catalog/furniture/bedrooms
то этот адрес обрабатывается самым первым правилом RewriteRule, и до редиректа на адрес со слешем не доходит
и в этом случае может помочь код
RewriteCond %{ENV:REDIRECT_RWR} ^yes$RewriteRule .* - [L]RewriteCond %{ENV:REDIRECT_STATUS} ^$RewriteRule ^(.*)/[^./]$ $0/ [R=301,L,E=RWR:yes]
вставленный сразу после
RewriteEngine On
(если Вы еще не пробовали применить мое самое первое предложение, до того как выложили содержимое htaccess )
Ну тогда последнее, что могу предположить и посоветовать:
в htaccess возможно есть правила которые преобразуют адрес, не позволяя сделать редирект
попробуйте добавить в htaccess в корне сайта перед первыми имеющимися командами RewriteRule или Redirect следующий код
(сразу после
RewriteBase /)
RewriteCond %{ENV:REDIRECT_RWR} ^yes$RewriteRule .* - [L]RewriteRule ^(.*)ru/(.*)$ $1/$2 [R=301,L,E=RWR:yes]
третья строчка делает 301 редирект на адрес без "/ru/" и устанавливает переменную "RWR"
а первые две строки делают выход из преобразований, если переменная "RWR" есть.
Не нашел в Вашем htaccess правил, которые делают переадресацию
со страниц /catalog/furniture/bedrooms на страницы /catalog/furniture/bedrooms/
Добавьте после строк
RewriteCond %{REQUEST_URI} ^(.*)/index.php$
RewriteRule ^(.*)$ %1/ [R=301,L]
RewriteCond %{REQUEST_METHOD} =GET RewriteRule ^(.*)/[^./]$ $0/ [R=301,L]
а http://site.ru/ у Вас нормально отображается? (не перебрасывает на http://site.ru/ru/ ?)
если нормально, то можно попробовать добавить флаг PT
RewriteRule ^(.*)ru/(.*)$ $1/$2 [R=301,L,PT]
Он нужен, если используются кроме mod_rewrite еще и другие трансляторы "URI-имя файла" (иначе они не видят результатов работы RewriteRule и обрабатывают исходный URI)
не знаю что такое Жумфиш, но вдруг поможет
а так попробуйте:
RewriteRule ^(.*)ru/(.*)$ $1/$2 [R=301,L]
для адреса типа
http://site.ru/ru/index.php
первый вариант действительно не работает
он работает для адресов, если в них перед "/ru/" есть папка
http://site.ru/folder/ru/index.php
не имел дела с битриксом, но наверно у Вас уже в htaccess прописано много правил преобразований, а они могут вносить свое влияние
Поэтому чтоб разобраться с тем кодом что Вы привели, нужно видеть весь файл htaccess.
Но есть и другой вариант:
попробуйте добавить в htaccess в корне сайта перед первыми имеющимися командами RewriteRule или Redirect
RewriteCond %{ENV:REDIRECT_RWR} ^yes$RewriteRule .* - [L]RewriteCond %{ENV:REDIRECT_STATUS} ^$RewriteRule ^(.*)/[^./]$ $0/ [R=301,L,E=RWR:yes]RewriteCond %{ENV:REDIRECT_STATUS} ^$RewriteRule ^(.*)/?index\.php$ http://%{HTTP_HOST}/$1/ [R=301,L,E=RWR:yes]
Первая пара строк прекращает дальнейшие преобразования если они были сделаны во 2 или 3 парах строк
Вторая пара строк делает 301 редирект на адрес с добавления слеша (если его нет и преобразований еще не было)
Третья пара строк делает 301 редирект на каталог, если запрашивается index.php
здесь я не совсем уверен в работоспособности приведенной строки для index.php в подкаталогах
если бы нужно было только в корне сайта, то так
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index.php$ http://%{HTTP_HOST}/ [R=301,L,E=RWR:yes]
Надеюсь у Вас сейчас нормально отобажаются адреса, заканчивающиеся на слеш (иначе нужны еще дополнительные команды)
добавьте в htaccess в корне сайта
RewriteEngine OnRewriteBase /RewriteRule ^(.*)/ru/(.*)$ $1/$2 [R=301,L]
(если первые 2 строчки уже есть в htaccess, еще раз добавлять не нужно)
Чтобы убрать 301 редиректом любую строку запроса в адресе после index.php добавьте в htaccess в корне сайта
RewriteCond %{QUERY_STRING} !^$RewriteRule ^index.php$ index.php? [R=301,L]
И не забудьте проверить, включен ли у Вас модуль mod_rewrite (если в htaccess нет следующих строк, добавьте их)
RewriteEngine OnRewriteBase /
PROGRAMMATOR, Ваш вариант выдергивает ссылки не только из тега "а", но и из тега "link", например
<link rel="icon" href="favicon.ico" type="image/x-icon" />
SeoSkunk, если базовым является site.ru, и работаем на PHP, то все ссылки с site.ru можно выбрать так:
if(preg_match_all('#<a[^>]*href=["\' ]*([^>]*site.ru[^>\'"]*)["\' ]*[^>]*>#i',$content,$match)){ print '<pre>'; print_r ($match[1]); print '</pre>'; }
а если хотите выбрать все ссылки, а не только на site.ru, то так:
if(preg_match_all('#<a[^>]*href=["\' ]*(https?://[^>\s\'"]{4,80})[^>\'"]*["\' ]*[^>]*>#i',$content,$match)){ print '<pre>'; print_r ($match[1]); print '</pre>'; }
gormarket добавил 30.03.2011 в 09:56
Я вчера был не совсем прав:
пытался "быстренько допилить" заготовку, ранее написанную для других целей, и не учел, что могут быть еще и относительные ссылки
Так что мой последний вариант такой:
if(preg_match_all('#<a[^>]*href=["\'\s]*([^>"\'\s]+)["\'\s]*[^>]*>#i',$content,$match)){ print '<pre>'; print_r ($match[1]); print '</pre>';}