Правила для редиректа и подмены адресов

ЕСТЬ РЕШЕНИЕ

как использовать?

#1 6 августа 2022 в 17:46

Подскажите с реальными примерами, бо я ничего не понял. Доки читал.
Как их использовать с такими ссылками? Или с параметрическими не получится?
Как эту фичу(Правила для редиректа и подмены адресов) можно применить на сайте? Спасибо.

  1. [
  2. {
  3. "source": "http://site.dev/board?city=500",
  4. "target": "/get",
  5. "action": "board/moygorog"
  6.  
  7. },
  8. {
  9. "source": "http://site.dev/board?city=500",
  10. "target": "board/moygorog",
  11. "action": "redirect"
  12. },
  13. {
  14. "source": "http://site.dev/board?city=500",
  15. "target": "board/moygorog",
  16. "action": "rewrite"
  17. }
  18. ]
#2 6 августа 2022 в 18:47

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

Tim T

Вот на этом сайте (это исключительно для этого сайта, для других это не нужно, т.к. здесь была миграция с InstantCMS 1.X)

  1. [
  2. { "source": "#^about/([a-zA-Z0-9]+).html$#i", "target": "/about.html", "action": "redirect-301" },
  3. { "source": "#^download.html$#i", "target": "/get", "action": "redirect-301" },
  4. { "source": "#^catalog(.*)$#i", "target": "https://instantcms.ru/", "action": "redirect-301" },
  5. { "source": "#^wiki$#i", "target": "https://docs.instantcms.ru/", "action": "redirect-301" },
  6. { "source": "#^wiki\/(.*)$#i", "target": "https://docs.instantcms.ru/", "action": "redirect-301" },
  7. { "source": "#^rss\/content\/2\/feed.rss$#i", "target": "rss/feed/pages?category=2", "action": "rewrite" },
  8. { "source": "#^rss\/blogs\/all\/feed.rss$#i", "target": "rss/feed/blogs", "action": "rewrite" },
  9. { "source": "#^rss\/comments\/all\/feed.rss$#i", "target": "/rss/feed/comments", "action": "redirect-301" },
  10. { "source": "#^users\/([0-9a-z_]+)\/forumposts.html$#i", "target": "/users/{1}/forum", "action": "redirect-301" },
  11. { "source": "#^users\/([0-9a-z_]+)\/karma.html$#i", "target": "/users/{1}/karma", "action": "redirect-301" },
  12. { "source": "#^users\/([0-9a-z_]+)\/comments.html$#i", "target": "/users/{1}/comments", "action": "redirect-301" },
  13. { "source": "#^novosti\/page-([0-9]+)$#i", "target": "/novosti?page={1}", "action": "redirect-301" },
  14. { "source": "#^blogs\/latest-([0-9]+).html$#i", "target": "/blogs?page={1}", "action": "redirect-301" },
  15. { "source": "#^registration$#i", "target": "/auth/register", "action": "redirect-301" },
  16. { "source": "#^users\/([0-9]+)\/files.html$#i", "target": "/users/{1}/files", "action": "redirect-301" }
  17. ]

Или с параметрическими не получится?

Tim T

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

  1. [
  2. {
  3. "source": "board\\?city=500",
  4. "target": "/get",
  5. "action": "board/moygorog"
  6.  
  7. }
  8. ]
#3 6 августа 2022 в 21:04

Капец( сессия закончилась, столько просидел за редактором… 😅)))
Вобщем, спасибо за объяснение.
Пока ничего не получается, в адресной строке board?city=9916
Пробовал по разному… не редиректит на нужную страницу.

  1. [
  2. {
  3. "source": "board\\?city=9916",
  4. "target": "redirect",
  5. "action": "board/moygorog"
  6. },
  7. {
  8. "source": "board\\?city\\=9916",
  9. "target": "redirect",
  10. "action": "board/moygorog"
  11. },
  12.  
  13. {
  14. "source": "board\\?city=9916",
  15. "target": "rewrite",
  16. "action": "board/moygorog"
  17. },
  18. {
  19. "source": "board\\?city\\=9916",
  20. "target": "rewrite",
  21. "action": "board/moygorog"
  22. },
  23.  
  24. {
  25. "source": "board\\?\\city\\=\\9916",
  26. "target": "rewrite",
  27. "action": "board/moygorog"
  28. }
  29. ]

Буду учить json и регулярные выражения.

Добавлено спустя 42 минуты

Не смог проверить на демо сайте, та к конфиг под защитой.

Но у меня на локальном серваке нотис.

Warning: preg_match(): Delimiter must not be alphanumeric or backslash in
\system\controllers\redirect\hooks\engine_start.php

on line 26

  1. <?php
  2. //проверяем совпадение выражения source с текущим uri
  3. if ( preg_match( $rule[ 'source' ], $this->cms_core->uri_before_remap, $matches ) ) {

Посмотрите пожалуйста, может это только у меня.

Добавлено спустя 3 минуты

На локальном добавил в Компонент Редиректы тот json что выше, сохранил, вкрючил режим отладки.

#4 7 августа 2022 в 13:04

Tim T, так разделитель и другие части регулярного выражения то вы забыли, я же вам дал пример. Как то так должно быть:

  1. [
  2. {
  3. "source": "#^board\\?city=9916$#i",
  4. "target": "redirect",
  5. "action": "board/moygorog"
  6. }
  7. ]
#5 7 августа 2022 в 15:39

Не знаю я что происходит😟. Пока-что при наборе в адресной site/board?city=9916 переходит на site/board?city=9916
Я думал с site/board?city=9916 перебросит на site/board/vinnitsa
Хотя все по примеру что выше.
Я думаю что для поисковиков адрес site/board/vinnitsa получше чем city=9916 вот и пробую.
Может их в htacces прописать? Правда их там очень много))) Вот задачка на пару недель😄
Хотя что так что эдак… может вообще не делать?

#6 7 августа 2022 в 16:50

Не знаю я что происходит

Tim T

Невнимательность. Откуда в target redirect стоит. Короче, с параметрическими ссылками не работает.

Нужно сделать:

  1. [
  2. {
  3. "source": "#^board\\?city=9916$#i",
  4. "target": "/board/moygorog",
  5. "action": "redirect"
  6. }
  7. ]

И поправить хук system/controllers/redirect/hooks/engine_start.php

после строки

  1. if ($rules) {

Вставить

  1. $checked_uri = $this->cms_core->uri_before_remap;
  2. if ($this->cms_core->uri_query) {
  3. $checked_uri .= '?' . http_build_query($this->cms_core->uri_query);
  4. }

И ниже строку

  1. if (preg_match($rule['source'], $this->cms_core->uri_before_remap, $matches)) {

Заменить на строку

  1. if (preg_match($rule['source'], $checked_uri, $matches)) {

И всё заработает как надо с параметрическими ссылками. Я проверил на этот раз сам :)

Ну и документация тут docs.instantcms.ru/manual/components/redirect Пример рабочего конфига этого сайта я дал выше.

#7 7 августа 2022 в 17:46

!!! Спасибо большое)) Заработал редирект!👍

#8 7 октября 2023 в 08:29

Здравствуйте, подскажите по правилу, мне надо чтобы ссылки типа " /shop?a " или " /shop?yclid=5871503726047979916 " редиректились просто на /shop

делая так

  1. [
  2. {
  3. "source": "#^shop\\?*",
  4. "target": "shop",
  5. "action": "redirect"
  6. }
  7. ]

не срабатывает

Добавлено спустя 43 минуты

Здравствуйте, подскажите по правилу, мне надо чтобы ссылки типа " /shop?a " или " /shop?yclid=5871503726047979916 " редиректились просто на /shop

делая так

  1. [
  2. {
  3. "source": "#^shop\\?*",
  4. "target": "shop",
  5. "action": "redirect"
  6. }
  7. ]

не срабатывает

Юрий

Сам спросил, сам отвечу

Вот так работает:

  1. [
  2. {
  3. "source": "#^shop\\?(.*)$#i",
  4. "target": "shop",
  5. "action": "redirect"
  6. }
  7. ]
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.