Обработка списка редиректов для .htaccess с гет параметрами в адресе
Из заголовка, думаю, мало что понятно. Попробую пояснить.
При переезде с одного движка на другой, скорее всего меняются урлы на сайте. Нужно настроить редиректы на сайте. Приходят сеошники с экселем в котором: в одном столбце список старых урлов, в другом список новых. В третьем столбце у них формула что-то вроде: =СЦЕПИТЬ($D$2;A3;" ";C3;" ";$E$2), которая даёт примерно такую строку в итоге:
RewriteRule ^/link1/$ /link2/ [L,R=301]
И в принципе эта схема рабочая. Пока в первом столбце не появятся урлы с гет параметрами(это те, которые следуют после знака «?»). Для таких урлов надо пользовать RewriteCond, в который выносить гет-параметры. Наверное, как-то можно это решить и в экселе, но мы пойдём путём джедая — обработаем список уже готовых урлов на PHP.
Я написал PHP скрипт, который берёт список редиректов, обрабатывает их и отдаёт в рабочем варианте.
В файле list список кривых редиректов, разделенных переносом строки.
/* Before: RewriteRule ^search.php?color=18 /search/?set_filter=y&af_106_414524117=Y&af_132_257141749=Y [L,R=301] RewriteRule ^catalog/collect.php?ELEMENT_ID=144 /sublimia/ [L,R=301] After: RewriteCond %{QUERY_STRING} ^color=18$ RewriteRule ^search.php$ /search/?set_filter=y&af_106_414524117=Y&af_132_257141749=Y [L,R=301] RewriteCond %{QUERY_STRING} ^ELEMENT_ID=144$ RewriteRule ^catalog/collect.php$ /sublimia/? [L,R=301] */ $rules = []; if(($file = file('list')) !== false){ foreach ($file as $rule) { list($rRule, $where, $to, $ruleOptions) = explode(' ', $rule); if(($pos = strpos($where, '?')) === false){ $rules[] = sprintf( '%s %s %s %s', $rRule, $where . (strpos($where, '$') == false ? '$' : ''), $to, $ruleOptions ); }else{ $rules[] = sprintf( '<br/ >RewriteCond %{QUERY_STRING} ^%s$<br/ >%s ^%s$ %s %s<br />', substr($where, $pos + 1), $rRule, substr($where, 1, $pos - 1), $to . (strpos($to, '?') === false ? '?' : ''), $ruleOptions ); } } } echo implode('<br />', $rules);
Запускаем этот скрипт и копируем результат с свой .htaccess.
Не думаю, что это много кому понадобится, но лично мне экономило пару раз время.