-1

我的链接就像“ 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();
        }
   }
?>

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

4

1 回答 1

2

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

使用RewriteRules 时,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 也可能是错误的。

但我希望你明白这一点。

于 2012-07-14T07:48:25.957 回答