重定向旧的动态链接,搜索引擎友好链接
我的链接,如“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();
}
}
?>
如果有人看到了一些错误(我是新来这个领域),我会很高兴听到他们的声音,并学习如何做这个事情做得更好......
您可能希望将旧链接重定向到新网址,以便人们在将博客粘贴到博客等时使用新链接。
当使用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也可能是错误的。
但我希望你明白这一点。
谢谢,我正在尝试:) – user1483138 2012-07-14 07:54:41
我设法写的php代码...你可以在这里试试 http://www.shinylook.ro /redirect_old_links.php?id=44 但我不能解决htaccess重写代码重定向到该文件.. – user1483138 2012-07-14 08:54:07
@ user1483138我看到你刚刚编辑你的问题,你说它的工作,是吗?还是你还需要帮助? – Prody 2012-07-14 11:23:26
只是确保转义您在SQL查询中使用的输入变量。在这种情况下,因为你想要一个整数,只需要生成'$ produs = intval($ _ GET [“id”]);'。 – Prody 2012-07-14 11:24:24
我刚刚修改为$ produs = intval($ _ GET [“id”]);但你能告诉我更多关于逃生变量..我是新来的PHP和我不知道很多... – user1483138 2012-07-14 12:06:51
基本上,任何时候你使用用户输入将它添加到SQL查询,你必须妥善消毒它。作为一个非常简单的解决方案,你可以在PHP中使用'mysql_real_escape_string'。您希望这样做,以便恶意用户无法在查询中注入额外的SQL代码。 – Prody 2012-07-14 12:49:32