Шаблон в RewriteRule верный.
Проблема в строке с RewriteCond.
В переменной %{THE_REQUEST} содержится полная строка запроса "GET /index.php/company HTTP/1.1", а шаблон "^[A-Z]{3,9}\ (.*)/index\.php\ HTTP" совпадет только если в переменной найдётся такой фрагмент "/index.php HTTP".
Уберите строку с этим RewriteCond и редирект заработает.
Вот еще другой вариант
RewriteCond %{THE_REQUEST} " /index\.php(/\S*) " RewriteRule ^ %1 [R=301,L]
DirectorySlash Off AddDefaultCharset utf8 Options +FollowSymLinks RewriteEngine on RewriteCond %{HTTP_HOST} ^домен.ru RewriteRule (.*) http://www.домен.ru/$1 [R=301,L] RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ RewriteRule ^index\.php$ http://www.домен.ru/ [R=301,L] RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*[^/])$ $1.php
Получается в корне сайта есть папка stranica и файл stranica.php.
При запросе /stranica должен исполняться stranica.php.
DirectorySlash Off RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*[^/])$ $1.php
Или обрезать пустые переменные с помощью map.
map "value1=$1&value2=$2&value3=$3&value4=$4&value5=$5" $tmp { ~^(?<1>(?:&?[^&=]+=[^&]+)+) $1; }
А в rewrite тогда использовать /index.php?$tmp;
(?: ) позволяет группировать также как и обычные скобки, но без сохранения результата в переменные $1..$9
Я так понимаю, что там нужно одним выражением обрабатывать переменное количество элементов. Тогда последние 4 части должны быть необязательными
(?:(.*)/)?
Метасимвол точка совпадает также и со слешем, поэтому предлагаю вместо точки [^/].
(?:([^/]*)/)?
Наверно и квантификатор * стоит заменить на +, иначе будет совпадать с адресами вида ////.
Вот еще вариант
rewrite ^/([^/]+)/(?:([^/]+)/)?(?:([^/]+)/)?(?:([^/]+)/)?(?:([^/]+)/)?$ /index.php?value1=$1&value2=$2&value3=$3&value4=$4&value5=$5;
Когда в урл менее 5 частей, то последние переменные будут объявлены пустыми
/lol/ => /index.php?value1=lol&value2=&value3=&value4=&value5=
Удалить пустые get параметры можно так
if ($args ~ ^(.*?)(?:[^&=]+=(?:&|$))+(.*) ) { set $args $1$2; }
Вместо key2 нужен фрагмент общий для неправильных адресов.
Для /gde-kupit-saiding_keyword/ таким фрагментом был keyword.
Для /gde-kupit-saiding/centralnii-okrug/ таким фрагментом наверно будет centralnii-okrug или centralnii. Смотря как именно коверкает адрес тот глючный скрипт.
А вот количество адресов в списке изрядное. Несколько десятков адресов было бы норм, а вот несколько сотен в .htaccess лучше не запихивать.
Замена несуществующих картинок на /default.jpg
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule \.(jpg|png|gif)$ default.jpg [L]
Откуда это взяли?
Я же совсем другой шаблон предлагал.
Сначала в шаблоне идет искомый keyword причем без ^ (это маркер начала строки, он здесь не нужен).
Потом метасимвол точка и негативный просмотр назад (?<! ) с помощью этой конструции проверяем что вокруг keyword нету символов _ и /.
Зацикливания здесь не будет. Этот шаблон не совпадает с адресами где нет keyword, а также не совпадет с правильным адресом gde-kupit-saiding_keyword/ т.к. вокруг keyword есть символы _ и /.
Я специально и ссылку давал https://regex101.com/r/yY8rM8/1. Там можно наглядно посмотреть, какие адреса ловит эта регуляка.
Можно не писать отдельные RewriteRule для каждого слова, а задать списком соответствие слов и урл.
RewriteCond "\ keyword = /pred/gde-kupit-saiding_keyword/ \ key2 = /blabla-url-for-key2/ \ key3 = /blabla-url-for-key3/ \ key4 = /blabla-url-for-key4/ \ @%{THE_REQUEST}" ^(?:(\S++)\s+=\s+(\S+)\s+([^@]*+@\S++\s(?!\2)\S+\1)?)++(?(3)|(?!)) RewriteRule ^ %2 [R=301,L]
Т.е. формат строк простой.
В начале строки искомое слово. Далее через пробелы и знак равно пишем нужный урл. Далее через пробелы пишем обратный слеш в конце строки.
Главное, чтобы не было пробелов после \, иначе будет ошибка синтаксиса.
Предложенный вариант проверяет наличие keyword, который не обрамлен _ и /.
Если нужна более строгая проверка, то как-то так
RewriteRule ^pred/gde.?kupit.?saiding.?keyword.(?<!_keyword/) http://ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [R=301,L]
Шаблон keyword.(?<!_keyword/) ловит большую часть ошибочных урл
https://regex101.com/r/yY8rM8/1---------- Добавлено 23.12.2015 в 16:56 ----------Или даже так keyword.(?<!gde-kupit-saiding_keyword/)
https://regex101.com/r/yY8rM8/2
Т.е. правильно
_keyword/
Неправильно
_keyword-
_keyword_
gkeyword/
Тогда надо примерно так
RewriteRule keyword.(?<!_keyword/) http://ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [R=301,L]