А разгадка проста :)
Там перед вычислением хеш суммы удаляются комментарии с помощью функции 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]
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}
Порядок расположения правил имеет значение. Результат работы правил влияет на последующие правила.
Поэтому редиректы должны срабатывать до того как другие правила что-нибудь поменяют.
Ставьте редирект в самом верху сразу после RewriteEngine On
RewriteCond %{QUERY_STRING} ^_openstat RewriteRule ^(.*)$ /$1? [R=301,L]
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]
^/ - то с чем работает RewriteRule не начинается с "/".
[a-z-0-9]+$ - в символьный класс нужно включить / и после добавить \.html.
RewriteRule ^([-a-z0-9]+\.html)/[-a-z0-9/]+\.html$ /$1
В таком виде это внутренее перенаправление. Для внешнего перенаправления добавить [R=301,L] и тогда будет 301 редирект.