jkm

Рейтинг
120
Регистрация
20.02.2014
ps axf:
"в лоб" заменить не получится. вариант с использованием preg_replace_callback

Да ладно :)


$txt = <<<EOF
в последовательностях вида src="qqq www ee" и href="fewfwe e fe" и заменяет
src="jhbgsc sdhjgsj hgj"
EOF;

$txt = preg_replace('%(?:src|href)="[^ "]*\K |\G(?!\A)[^ "]*\K %i', '_', $txt);
echo $txt;

https://regex101.com/r/gD1sF8/1

netwind:
Как это вообще может быть связано ? загадка просто.

А разгадка проста :)

Там перед вычислением хеш суммы удаляются комментарии с помощью функции php_strip_whitespace. Результат её работы зависит от настроек php. Очевидно AI-WHITELIST.db генерился с включенной short_open_tag=on

В RewriteRule попадает не вся ссылка, а только путь к файлу, так что GET параметры следует искать в %{QUERY_STRING}.

Для ссылок site.ru/?hello_world-122-2-3-3-rw34-r3 нужно так


RewriteCond %{QUERY_STRING} hello_world
RewriteRule ^ http://www.site.ru/? [R=301,L]

Как-нибудь так


RewriteEngine On

RewriteRule ^(?:[^/]+/){2,}\d+-([^/]+)$ /$1? [R=301,L]

Ну, если редирект работает верно, но Magento показывает ошибку, то даже если сначала вырезаем из URL символы ?_, а потом уже обрезаем всё лишнее (начиная с openstat).

В итоге после перехода на верный адрес Magento точно также покажет ошибку.

Сначала нужно разобраться, почему происходит ошибка, если отрывать страницу


http://sitename.ru/product_name1.html

А чем не устраивал предложенный вариант.

Если нужен редирект на адрес с символом подчеркивания в конце http://sitename.ru/product_name1.html_, то нужно исправить /$1? на /$1_?


RewriteCond %{QUERY_STRING} ^_openstat
RewriteRule ^(.*)$ /$1_? [R=301,L]
Pekkonen:

Может быть всё таки получится модернизировать это:
RewriteRule (.+?)\.openstat.+ http://%{HTTP_HOST}/1 [L,R=301]

RedirectMatch permanent (.+?)\openstat.+$ http://sitename.ru$1

Нет, не получится.

Redirect и RedirectMatch это директивы mod_alias. Всё что после знака вопроса не участвует в сравнении с шаблоном.

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

Такая возможность есть у mod_rewrite. Но это делается не через RewriteRule, а конструкциями

RewriteCond %{QUERY_STRING}

или

RewriteCond %{THE_REQUEST}

Pekkonen:
Предложенный вами вариант срабатывает на другом сайте, но на этом ему что-то мешает, и в результате получаю неправильный адрес :(

Порядок расположения правил имеет значение. Результат работы правил влияет на последующие правила.

Поэтому редиректы должны срабатывать до того как другие правила что-нибудь поменяют.

Ставьте редирект в самом верху сразу после RewriteEngine On


RewriteCond %{QUERY_STRING} ^_openstat
RewriteRule ^(.*)$ /$1? [R=301,L]


---------- Добавлено 19.02.2016 в 14:05 ----------

В RewriteRule попадает не вся ссылка, а только путь к файлу. Аргументы переносятся в %{QUERY_STRING}


RewriteEngine On
RewriteRule ^([-a-z0-9]+\.html). /$1 [R=301,L]

RewriteCond %{QUERY_STRING} .
RewriteRule ^([-a-z0-9]+\.html) /$1? [R=301,L]

Или так


RewriteEngine On

RewriteCond %{THE_REQUEST} "^\S+ /([-a-z0-9]+\.html)[/?]"
RewriteRule ^ /%1? [R=301,L]

Если ставить в самый конец после всех правил например после RewriteRule .* index.php [L], то работать не будет. Ставь первым правилом.


RewriteEngine On
RewriteRule ^([-a-z0-9]+\.html)/[-a-z0-9/]+\.html$ /$1 [R=301,L]
Всего: 750