【问题标题】:New NICE URLs with 301s. How to make them work Together?带有 301 的新 NICE URL。如何让它们一起工作?
【发布时间】:2012-12-23 20:55:06
【问题描述】:

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

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 个变量:类别、产品 ID、产品标题和子类别。其中一些变量用于打开菜单。是的,URL 拉取带有空格和大小写的变量。

新的网站 url 有一个新的结构:

site.com/x/product-title-prodid2

rel 示例如下:

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 中没有使用相同的变量,所以这变得很棘手,因为显然我们必须创建一个规则来创建漂亮的 URL 和301?

我们已尝试将以下内容添加到 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

获取 URL 并重定向到页面,但这对于 SE 来说是丑陋的。


更新:

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

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

MTX AMP(这是实际产品名称)如果在 3 个类别中列出,将有 1 个重复的 prodid2 和 3 个不同的 prodid1(每个类别 1 个)。它们都驻留在同一张表中。因此,如果我们有一个 prodid1,我们可以在 db 表中获取它旁边的 prodid2。

使用 prodid2 拉取在新站点上获取漂亮 URL 的规则

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

它带来了存储在数据库中的完整值。例如mtx-amps-8888

完整的网址是:

site.com/p/mtx-amps-888

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

所以 mtx-amps-888 不是 3 个键,它们是在创建产品时生成的,并一起保存在数据库中的单个字段中。它们已经包含了分离 - 所以这不是在 htaccess 中完成的。

cat (key) 值实际上用于扩展旧站点中使用的菜单,但要创建 301 重定向,我们可能会使用 prodid1,因为我们可以匹配该值以获得 prodid2。 prodid2 作为主查询获取新站点中的 nice URL,其值将带来存储在 db 中的 nice 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,我相信会创建一个循环。

希望这是有道理的。你不知道启动和运行它对我来说有多重要,所以我向那些可以提供帮助的人致以最良好的祝愿:)

【问题讨论】:

  • 真的很混乱。 ¿ 什么是以及如何获得“...如果我们有 prodid1...”中提到的prodid1?是否总是有 3 个键(product-title-prodid2)? ¿ 他们总是被- 分开吗?例如,在查询中,cat 是一个CAR%20AUDIO 是一个。在您的示例中使用这些属性会更清楚,例如 key1=value1 等。
  • 感谢您的快速响应,我很惊讶人们准备好提供帮助的速度如此之快。希望我也能尽快分享我的专业知识。

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


【解决方案1】:

只需重新创建文件/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');
?>

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2012-10-08
    • 2015-03-04
    相关资源
    最近更新 更多