301使用动态网址和多个ID重定向帮助

时间:2009-11-12 16:22:19

标签: .htaccess mod-rewrite http-status-code-301

我刚刚为www.wildchildclothes.com重新设计了一个新的URL结构。旧站点在Zen Cart上运行,并且URL结构错误。以下是我想要重定向的一些示例:

OLD:www.wildchildclothes.com/page.html?chapter=1&id=21 新:www.wildchildclothes.com

和...

OLD:www.wildchildclothes.com/index.php?main_page=faq_info&fcPath=0&faqs_id=13 新: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 个答案:

答案 0 :(得分:2)

以上解决方案均不适合我,但确实如此:

将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让我头疼,所以我不再深入研究。

我希望这可以帮助其他人!

  • 约拿

答案 1 :(得分:0)

如果您使用PHP进行重定向,那将会更容易也更好。例如,您可以将此类请求重写为分析URL参数并重定向到正确页面的PHP脚本。也许是这样的:

// 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]

答案 2 :(得分:0)

您希望在查询参数中允许多个字符。将[^&]&更改为[^&]*&

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]