301 Справка по перенаправлению с динамическими и множественными идентификаторами - PullRequest
0 голосов
/ 12 ноября 2009

Я только что сделал редизайн для www.wildchildclothes.com, который имеет новую структуру URL. Старый сайт работал на Zen Cart и имел плохую структуру URL. Вот несколько примеров того, с чего я хочу перенаправить:

СТАРЫЙ: www.wildchildclothes.com/page.html?chapter=1&id=21 NEW: www.wildchildclothes.com

и ...

СТАРЫЙ: www.wildchildclothes.com/index.php?main_page=faq_info&fcPath=0&faqs_id=13 NEW: www.wildchildclothes.com/customer-service.html

Вот что в моем .htaccess для достижения этой цели:

RewriteEngine On
RewriteBase / 
RewriteCond %{QUERY_STRING} ^([^&]*&)*chapter=1(&|$)
RewriteCond %{QUERY_STRING} ^([^&]*&)*id=21(&|$)
RewriteRule ^page\.html http://www.wildchildclothes.com? [L,R=301]
RewriteCond %{QUERY_STRING} ^([^&]*&)*main_page=faq_info(&|$)
RewriteCond %{QUERY_STRING} ^([^&]*&)*fcPath=0(&|$)
RewriteCond %{QUERY_STRING} ^([^&]*&)*faqs_id=13(&|$)
RewriteRule ^index\.php$ http://www.wildchildclothes.com/customer-service.html? [L,R=301]

Но это совсем не работает - меня только отправляют на мою страницу 404, а не начинают перенаправлять. Кто-нибудь может пролить свет? Полный .htaccess размещен ниже.

Большое спасибо, Ионы

Ответы [ 3 ]

2 голосов
/ 23 ноября 2009

Ни одно из вышеперечисленных решений не помогло мне, но это делает:

Для перенаправления www.wildchildclothes.com/page.html?chapter=1&id=21 на www.wildchildclothes.com:

RewriteCond %{query_string} chapter=1&id=21
RewriteRule (.*) http://www.wildchildclothes.com/? [R=301,L]

Для перенаправления www.wildchildclothes.com/index.php?main_page=document_product_info&products_id=280 на www.wildchildclothes.com:

RewriteCond %{query_string} main_page=document_product_info&products_id=280
RewriteRule (.*) http://www.wildchildclothes.com/? [R=301,L]

Для перенаправления www.wildchildclothes.com/index.php?main_page = faq_info & fcPath = 0 & faqs_id = 9 до www.wildchildclothes.com/customer-service.html:

RewriteCond %{query_string} main_page=faq_info&fcPath=0&faqs_id=9
RewriteRule (.*) http://www.wildchildclothes.com/customer-service.html? [R=301,L]

Я уверен, что есть лучшие способы сделать это, но это работает для меня, и .htaccess просто даету меня болит голова, поэтому я больше не копаю.

Надеюсь, это поможет кому-то еще!

  • Иона
0 голосов
/ 12 ноября 2009

Вы хотите разрешить более одного символа в параметрах запроса. Измените [^&]& на [^&]*&:

RewriteCond %{QUERY_STRING} ^([^&]*&)*chapter=1(&|$)
RewriteCond %{QUERY_STRING} ^([^&]*&)*id=21(&|$)
RewriteRule ^page\.html$ http://www.wildchildclothes.com? [L,R=301]

RewriteCond %{QUERY_STRING} ^([^&]*&)*main_page=faq_info(&|$)
RewriteCond %{QUERY_STRING} ^([^&]*&)*fcPath=0(&|$)
RewriteCond %{QUERY_STRING} ^([^&]*&)*faqs_id=12(&|$)
RewriteRule ^index\.php$ http://www.wildchildclothes.com? [L,R=301]
0 голосов
/ 12 ноября 2009

Было бы проще и намного лучше, если бы вы использовали PHP для перенаправления. Вы можете, например, переписать такие запросы в PHP-скрипт, который анализирует аргументы URL и перенаправляет на правильную страницу Может быть, что-то вроде этого:

// old-to-new.php
$rules = array(
    array(
        array('chapter' => '0', 'id' => '23'),  // old URL parameters
        '/customer-service.html'                // new URL
    ),
    // …
);
foreach ($rules as $rule) {
    if (array_intersect_assoc($rule[0], $_GET) == $rule[0]) {
        header('Location: http://example.com'.$rule[1], true, 301);
        exit;
    }
}
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
exit;

и соответствующий RewriteRule:

RewriteRule ^page\.html$ old-to-new.php [L]
...