将旧的动态链接重定向到SEO友好链接

时间:2012-07-14 07:42:56

标签: html apache .htaccess sites

我的链接就像“http://www.shinylook.ro/product.php?id=58”,我将其重写为

"http://www.shinylook.ro/produs/58/saboti-dama/"

使用此代码:

RewriteRule ^produs/([0-9]+)/([a-zA-Z0-9_-]+)\/ product.php?id=$1 [L]

但我无法将旧链接重定向到新链接。如果有人输入旧的,则重定向到新的。

我试过这个:

RewriteRule ^product.php?id=$1 produs/([0-9]+)/([a-zA-Z0-9_-]+)\/  [L,R=301]

但它不起作用。

如何解决此问题?

编辑:

我设法写了PHP代码......你可以在www.shinylook.ro/redirect_old_links.php?id=44尝试。

但我无法解决htaccess重写代码重定向到该文件......

我使用了RewriteRule ^product.php?id=([0-9]+) redirect_old_links.php?id=$1 [R=301,NC]

但它不起作用。

编辑2:

我设法解决了问题...... htaccess看起来像

RewriteCond %{ENV:REDIRECT_STATUS} !=200

RewriteCond %{QUERY_STRING} ^id=([0-9]+)$

RewriteRule ^product.php$ /redirect_old_links.php/ [L]
RewriteRule ^produs/([0-9]+)/([a-zA-Z0-9_-]+)\/$ product.php?id=$1 [L]

PHP代码如下:

<?
    include "_storescripts/connect_to_mysql.php";
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    if (isset($_GET['id'])) {
        $produs = $_GET['id'];

        $sql =  mysql_query("SELECT nume_produs FROM products WHERE id='$produs'"); // Chose the product

        // ------- We check if it exists ---------
        $existCount = mysql_num_rows($sql); // Count

        if ($existCount == 1) {
            while($row = mysql_fetch_array($sql)){
                $nume_brut = $row["nume_produs"];
                $nume = explode(" ", $nume_brut);
            }
            $nume_final = strtolower($nume[0]."-".$nume[1]);
            $name = urlencode($nume_final);
            header("location: http://www.shinylook.ro/produs/$produs/$name/", TRUE, 301);
        }
        else {
            echo ("This product id does not exist!");
            exit();
        }
   }
?>

如果有人看到一些错误(我是这个领域的新手),我会很高兴听到他们并学习如何做得更好......

1 个答案:

答案 0 :(得分:2)

您可能希望将旧链接重定向到新网址,以便人们在博客上粘贴新链接时使用新链接。

使用RewriteRule时,Apache无法猜测名称的其余部分,以便执行重定向的其他部分。

它可以删除它:
produs/58/saboti-dama/ -> product.php?id=58
但是为了反过来又会在哪里获得名称?

为此,您应该编写一个redirect_old_links.php文件,该文件只会重定向到新位置:
http://php.net/manual/en/function.header.php

示例:

用户访问
product.php?id=58

RewriteRule product.php?id=([0-9]+) redirect_old_links.php?id=$1 [L]

redirect_old_links.php

mysql_select("SELECT name FROM PRODUCTS WHERE ID = ".$_GET["id"]);
// the above line is just so you get the point,
// please create a proper query with PDO and proper escaping

$id = urlencode($product_id);
$name = urlencode($product_name);

header("Location: produs/$id/$name/");

抱歉,我很长时间没有使用过PHP,你必须自己查看这些函数的文档,我不记得了mysql_select / fetch过程。 Urlencode也可能是错误的。

但我希望你明白这一点。