带有301的新NICE网址。如何让他们一起工作?

时间:2012-12-22 23:24:31

标签: mod-rewrite friendly-url url-scheme

我有这个旧的网站网址结构:

site.com/folder/prod.php?cat=MAIN%20CAT%20&prodid1=123&prodtitle=PROD%20TITLE&subcat=SUB%20CAT

并且真实的例子将是:

site.com/folder/prod.php?cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS

在这里,您可以看到产品页面有4个变量:category,produt id,product title和sub category。其中一些变量用于打开菜单。是的,URL使用空格来拉变量,包括小写和大写。

新网站网址有一个新结构:

site.com/x/product-title-prodid2

一个例子就像:

site.com/x/mtx-amps-8888

通过在.htaccess中使用以下代码使用两个变量(友好slug +第二个产品ID:prodid2)来实现这一目标

<IfModule mod_rewrite.c>
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /

RewriteRule ^p/(.*)/$ product.php?prodid2=$1
RewriteRule ^p/(.*)$ product.php?prodid2=$1

</IfModule>

如果我们有来自同一张桌子的prodid1,我们可以获得prodid2,但不是反之亦然。

一切正常,但我们现在必须创建301重定向,显然因为旧/新网址中没有使用相同的变量,所以它变得棘手,因为显然我们必须为良好的URL创建创建单个规则, 301s?

我们已尝试将以下内容添加到htaccess:

RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]

并且它仅适用于1个产品,但是当添加2个或更多时,该网站会关闭。我成像这将是一个无限循环?

另一种方法是添加:

ErrorDocument 404 /404.php

获取网址并重定向到网页,但这对于SE来说会很难看。


更新:

很抱歉我对这个话题缺乏了解,对此我很陌生。

该产品有两个重要的ID。例如:

MTX AMP(实际产品名称)如果列在3个类别中,将重复1个单独的prodid2和3个不同的prodid1(每个类别1个)。它们都位于同一个表中。所以,如果我们有一个prodid1,我们可以在db表中得到它旁边的prodid2。

使用prodid2

提取在新网站上获取优质网址的规则
RewriteRule ^p/(.*)$ product.php?prodid2=$1

带来存储在数据库中的完整值。例如mtx-amps-8888&lt;&lt;这是一个slug + prodid2的混合

完整网址是:

site.com/p/mtx-amps-888

(p只是一个虚拟的forder,我们利用该变量来显示正确的页面模板)

因此mtx-amps-888不是3个密钥,这些密钥是在创建产品时生成的,并且在db中的单个字段中保存在一起。它们已经包含了分离 - 所以这不是在htaccess中完成的。

cat(key)值实际上用于扩展旧网站中使用的菜单,但为了创建301重定向,我们可能会使用prodid1,因为我们可以匹配该值以获得prodid2。 prodid2用作主要查询以获取新站点中的好URL,其值将带来存储在db中的好URL。

我所有研究的意义如下:

<IfModule mod_rewrite.c>
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /

RewriteRule ^p/(.*)$ product.php?prodid2=$1

RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]

RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=5555&prodtitle=BOSS%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]

RewriteCond %{QUERY_STRING} ^cat=CAR%20VIDEO&prodid1=6666&prodtitle=ALPINE%20DVDS&subcat=DVD%20PLAYERS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]

</IfModule>

请注意我从主重写规则中删除了一行:

RewriteRule ^p/(.*)/$ product.php?prodid2=$1

这只能确保用户也可以在URL的末尾使用/:site.com/p/mtx-amps-888 /

我还重复了3个产品的301重定向的重写条件,但我真的有大约3K产品列在这里。如果我保持1,它会起作用,但如果我加2,我相信会创建一个循环。

希望这是有道理的。你不知道让我这么做有多重要,所以我向那些可以提供帮助的人致以最良好的祝愿:)

1 个答案:

答案 0 :(得分:0)

只需重新创建文件/folder/prod.php并让php执行重定向。这是最简单,最干净的解决方案。

<?php
  $prodid1 = $_GET['prodid1'];
  //calculate prodid2 based on prodid1, or use mysql to retreive the prodid2 belonging to prodid1
  $prodid2 = $prodid1;//just for testing
  $newpath = "/p/$prodid2/";

  // redirect using 301
  header("Location: http://{$_SERVER['HTTP_HOST']}{$newpath}");
  header('HTTP/1.1 301 Moved Permanently');
?>