重定向旧的动态链接,搜索引擎友好链接

重定向旧的动态链接,搜索引擎友好链接

问题描述:

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

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

+0

只是确保转义您在SQL查询中使用的输入变量。在这种情况下,因为你想要一个整数,只需要生成'$ produs = intval($ _ GET [“id”]);'。 – Prody 2012-07-14 11:24:24

+0

我刚刚修改为$ produs = intval($ _ GET [“id”]);但你能告诉我更多关于逃生变量..我是新来的PHP和我不知道很多... – user1483138 2012-07-14 12:06:51

+0

基本上,任何时候你使用用户输入将它添加到SQL查询,你必须妥善消毒它。作为一个非常简单的解决方案,你可以在PHP中使用'mysql_real_escape_string'。您希望这样做,以便恶意用户无法在查询中注入额外的SQL代码。 – Prody 2012-07-14 12:49:32

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

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

但我希望你明白这一点。

+0

谢谢,我正在尝试:) – user1483138 2012-07-14 07:54:41

+0

我设法写的php代码...你可以在这里试试 http://www.shinylook.ro /redirect_old_links.php?id=44 但我不能解决htaccess重写代码重定向到该文件.. – user1483138 2012-07-14 08:54:07

+0

@ user1483138我看到你刚刚编辑你的问题,你说它的工作,是吗?还是你还需要帮助? – Prody 2012-07-14 11:23:26