проблема с мод_реврайт

12
kir_pich
На сайте с 09.07.2006
Offline
124
1193

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

Ситуация такова. Есть сайт, на нём есть офигенно корявый скрипт который был интегрирован в битрикс, который помимо нужного контента генерирует всякую фигню тоесть:

правильно ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword/

не правильно ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword-asd/, ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword_asd/ , ввв.мой-сайт.ru/pred/gdekupitsaidingkeyword/

Как правильно написать в хтаксессе написать правило типа

RewriteEngine On

RewriteRule keyword ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [L,R=301]

То-есть, если в ссылке есть слово keyword то будет перенапавление на gde-kupit-saiding_keyword

В вариации выше - происходит зацикливание и ничего не работает.

PS-если нужен будет адрес сайта, в личку скину.

я не идиот, просто у меня винтиков в голове не хватает! (c) kir_pich
J
На сайте с 20.02.2014
Offline
120
jkm
#1

Т.е. правильно

_keyword/

Неправильно

_keyword-

_keyword_

gkeyword/

Тогда надо примерно так


RewriteRule keyword.(?<!_keyword/) http://ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [R=301,L]
kir_pich
На сайте с 09.07.2006
Offline
124
#2
jkm:
Т.е. правильно
_keyword/

Неправильно
_keyword-
_keyword_
gkeyword/

Тогда надо примерно так

RewriteRule keyword.(?<!_keyword/) http://ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [R=301,L]

правильно только keyword, а всё остальное не правильно.

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/

Ps-да, скрипт настолько корявый к сожалению, и единственное рещение чтобы не переписывать скрипт, настроить редиректы на правильные страницы.

J
На сайте с 20.02.2014
Offline
120
jkm
#3

Предложенный вариант проверяет наличие 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

kir_pich
На сайте с 09.07.2006
Offline
124
#4
jkm:
Предложенный вариант проверяет наличие keyword, который не обрамлен _ и /.
Если нужна более строгая проверка, то как-то так

RewriteRule ^pred/gde.?kupit.?saiding.?keyword.(?<!_keyword/) http://ввв.мой-сайт.ru/pred/gde-kupit-saiding_keyword/ [R=301,L]

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

Шаблон keyword.(?<!_keyword/) ловит большую часть ошибочных урл
https://regex101.com/r/yY8rM8/1
---------- Добавлено 23.12.2015 в 16:56 ----------
Или даже так keyword.(?<!gde-kupit-saiding_keyword/)
https://regex101.com/r/yY8rM8/2

Приветствую, jkm.

вариация

- Отлавливает шикарно, но, итог отлова - зацикливание и Неверное перенаправление на странице

птопал дальше разбираться.

J
На сайте с 20.02.2014
Offline
120
jkm
#5

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


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]

Т.е. формат строк простой.

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

Главное, чтобы не было пробелов после \, иначе будет ошибка синтаксиса.

kir_pich
На сайте с 09.07.2006
Offline
124
#6
jkm:
Откуда это взяли?
Я же совсем другой шаблон предлагал.

В итоге заработало в таком виде

RewriteRule ^gde.?kupit.?saiding.?keyword.(?<!gde-kupit-saiding_keyword/) http://www.адрес_сайта/pred/gde-kupit-saiding_keyword/ [R=301,L]

в других видах либо зацикливалось, либо ничего не происходило.


jkm Спасибо большое:)

PS-пойду с этим разбираться

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]


---------- Добавлено 25.12.2015 в 19:00 ----------

А в key2 = /blabla-url-for-key2/ \ В такой формулировке писать:

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

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

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

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

Да, "рарработчек" старался когда писал скрипт😂😡🤪

J
На сайте с 20.02.2014
Offline
120
jkm
#7
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 лучше не запихивать.

kir_pich
На сайте с 09.07.2006
Offline
124
#8

Правильный тип адреса: /gde-kupit-saiding_keyword/

неправильный: /какое-то_левое_слово_keyword_какое-то_левое_слово/

то-есть, практически любой текст в урл может быть вокруг keyword и гуано скрипт выдаёт страницу и ответ 200.

физически на сайте есть путь /pred/ а далее все подкаталоги и адреса типа

gde-kupit-saiding/centralnii-federalnii-okrug/

kupit-fasadnye-paneli/centralnii-federalnii-okrug/

kupit-vodostoki/centralnii-federalnii-okrug/

prochee/centralnii-federalnii-okrug/

генерятся 1 файлом.

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

типа:

RewriteCond "\
RewriteCond %{QUERY_STRING} gde-kupit-saiding
centralnii-federalnii-okrug = /gde-kupit-saiding/centralnii-federalnii-okrug/ \
@%{THE_REQUEST}" ^(?:(\S++)\s+=\s+(\S+)\s+([^@]*+@\S++\s(?!\2)\S+\1)?)++(?(3)|(?!))
RewriteRule ^ %2 [R=301,L]


RewriteCond "\
RewriteCond %{QUERY_STRING} kupit-fasadnye-paneli
centralnii-federalnii-okrug = /kupit-fasadnye-paneli/centralnii-federalnii-okrug/ \
@%{THE_REQUEST}" ^(?:(\S++)\s+=\s+(\S+)\s+([^@]*+@\S++\s(?!\2)\S+\1)?)++(?(3)|(?!))
RewriteRule ^ %2 [R=301,L]


RewriteCond "\
RewriteCond %{QUERY_STRING} kupit-vodostoki
centralnii-federalnii-okrug = /kupit-vodostoki/centralnii-federalnii-okrug/ \
@%{THE_REQUEST}" ^(?:(\S++)\s+=\s+(\S+)\s+([^@]*+@\S++\s(?!\2)\S+\1)?)++(?(3)|(?!))
RewriteRule ^ %2 [R=301,L]


RewriteCond "\
RewriteCond %{QUERY_STRING} prochee
centralnii-federalnii-okrug = /prochee/centralnii-federalnii-okrug/ \
@%{THE_REQUEST}" ^(?:(\S++)\s+=\s+(\S+)\s+([^@]*+@\S++\s(?!\2)\S+\1)?)++(?(3)|(?!))
RewriteRule ^ %2 [R=301,L]



---------- Добавлено 28.12.2015 в 12:19 ----------

в типе

keyword = /pred/gde-kupit-saiding_keyword/ \

@%{THE_REQUEST}" ^(?:(\S++)\s+=\s+(\S+)\s+([^@]*+@\S++\s(?!\2)\S+\1)?)++(?(3)|(?!))

RewriteRule ^ %2 [R=301,L]

Всё работает на ура!!!

Но тут вылазит 1 минуc - все адреса где встречается keyword редиректит на в 1 место (то-есть есть 4 адреса с вхождением и перекидывает на тот который написан в правиле) (собственно не удивительно)

Если ставлю такую вариацию кейворда saiding_keyword - получаю ответ 500 =))))

saiding_keyword = /pred/gde-kupit-saiding_keyword/ \

@%{THE_REQUEST}" ^(?:(\S++)\s+=\s+(\S+)\s+([^@]*+@\S++\s(?!\2)\S+\1)?)++(?(3)|(?!))

RewriteRule ^ %2 [R=301,L]

kir_pich
На сайте с 09.07.2006
Offline
124
#9

Ковырялся с настройками, и вылез ещё 1 прикол, ограничение на количество строк/правил всего 150.

Возможно-ли данный массис реализовать через Rewritemap ?

Если да, то как правильней это будет сделать?

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond "\

RewriteMap real-to-user txt:/pred/map.txt

@%{THE_REQUEST}" ^(?:(\S++)\s+=\s+(\S+)\s+([^@]*+@\S++\s(?!\2)\S+\1)?)++(?(3)|(?!))

RewriteRule ^ %2 [R=301,L]

</IfModule>

В такой вариации?

J
На сайте с 20.02.2014
Offline
120
jkm
#10

По поводу ограничения в 150 строк. А если не запихивать весь список из сотни адресов в одно правило, а разделить его на несколько правил. По полсотни на каждый RewriteRule.

Чтобы правило работало только для адресов внутри одного раздела /pred/ нужно RewriteRule ^ заменить на RewriteRule ^pred/

Значит адреса имеют такой вид /pred/part1/part2/

В part1 разрешается gde-kupit-saiding, kupit-fasadnye-paneli, kupit-vodostoki, prochee.

В part2 разрешается centralnii-federalnii-okrug и какие-нибудь key2, key3, key4.

Если в part1 или part2 кроме разрешенного значения есть что-то лишнее, то сделать редирект на правильный адрес.


RewriteCond $1/$2 "(?x)(\
gde-kupit-saiding |\
kupit-fasadnye-paneli |\
kupit-vodostoki |\
prochee )\
[^/]* / .*? (\
centralnii-federalnii-okrug |\
key2 |\
key3 |\
key4 )"
RewriteCond "%1/%2 $1/$2" !^(\S+)\s\1$
RewriteRule ^pred/([^/]+)/([^/]+)/$ /pred/%1/%2/ [R=301,L]

Директива RewriteMap не работает в файле htaccess. Она может использоваться только в контексте server config, <VirtualHost>.

Так что для её примененения нужен доступ к файлам конфигурации веб-сервера (httpd.conf)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий