jkm

Рейтинг
120
Регистрация
20.02.2014
promoseo4:
totamon, Попробовал

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ (.*)/index\.php\ HTTP/
RewriteRule ^index\.php/(.*)$ http://ваш_сайт/$1 [R=301,L]

Не помогло. Какие еще есть варианты?

Шаблон в 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;
}
kir_pich:
А в key2 = /blabla-url-for-key2/ \ В такой формулировке писать:

gde-kupit-saiding\/centralnii-okrug = /gde-kupit-saiding/centralnii-okrug/ \

или по другому можно проще сделать?

Данный вопрос возник в связи с тем что в данном разделе встречается несколько раз centralnii-okrug.

И такой вопрос, насколько фигово для сайта/сервака наличии такой ереси в количестве 700+ строк? 😂😂😂
Да, "рарработчек" старался когда писал скрипт😂😡🤪

Вместо 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]

Откуда это взяли?


RewriteRule ^(?<!keyword/)

Я же совсем другой шаблон предлагал.


RewriteRule keyword.(?<!_keyword/)

Сначала в шаблоне идет искомый 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]


---------- Добавлено 23.12.2015 в 16:50 ----------

kir_pich:

true
/gde-kupit-saiding_keyword/


false
/keyword/
/saiding_keyword/
/gde-kupit-saiding-keyword-asd/
/gde-kupit-saiding_keyword-asd/
/gde-kupit-saiding_keyword_asd/
/gde-kupit-saiding-keyword-asd/
/gde-kupit-saiding-keyword-asd/
/gde-kupit-saiding-keyword_asd/
/gdekupitsaidingkeyword/
/gdekupitsaidingkeywordasd/

Шаблон 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]
Всего: 749