htaccess url重写但ID更改

时间:2013-07-15 09:18:42

标签: .htaccess

我想知道是否有可能重写一个看起来像这样的网址

www.example.com/item.php?id=1 to a www.example/item.php without the `?id=1`

请注意,1代表产品ID,因此可能会更改为2或任意数字,具体取决于用户选择的产品

我目前的htaccess 我现在.htaccess看起来像这样:

RewriteEngine on
RewriteBase /
RewriteRule ^item/(.*)$ test/main/pages/account/$1 [L]   // **the item.php file is in the item folder**
ErrorDocument 404 /test/main/pages/general/index.php
Options -Indexes
AuthName "main"

我做的就像

<?php
include('global.php'); ///database connection

function create_guid()
    {
            $microTime = microtime();
        list($a_dec, $a_sec) = explode(" ", $microTime);

        $dec_hex = dechex($a_dec* 1000000);
        $sec_hex = dechex($a_sec);

         ensure_length($dec_hex, 5);
         ensure_length($sec_hex, 6);

        $guid = "";
        $guid .= $dec_hex;
        $guid .= create_guid_section(3);
        $guid .= '-';
        $guid .= create_guid_section(4);
        $guid .= '-';
        $guid .= create_guid_section(4);
        $guid .= '-';
        $guid .= create_guid_section(4);
        $guid .= '-';
        $guid .= $sec_hex;
        $guid .= create_guid_section(6);

        return $guid;

    }

$stmt = $conn->prepare("INSERT INTO `Product (`pid`, `Guid`, `price`) VALUES
(13, '".$guid."', 13)");
$stmt->execute();

?>

我也是用PDO做的,因为我不是mysql的忠实粉丝

2 个答案:

答案 0 :(得分:3)

由于你的主要动机是让人们在网址中猜测id,并且由 lucas william 指出,你想要它的方式在.htaccess中是不可能的,你可以存储id数据库中每个产品的格式为guid格式(这种格式的id存储到数据库中的格式由 sugarCRM 使用),这也是满足您要求的正确替代品,您可以使用该ID唯一标识您的产品表每个记录:

创建guid的功能如下:

function create_guid()
    {
            $microTime = microtime();
        list($a_dec, $a_sec) = explode(" ", $microTime);

        $dec_hex = dechex($a_dec* 1000000);
        $sec_hex = dechex($a_sec);

         ensure_length($dec_hex, 5);
         ensure_length($sec_hex, 6);

        $guid = "";
        $guid .= $dec_hex;
        $guid .= create_guid_section(3);
        $guid .= '-';
        $guid .= create_guid_section(4);
        $guid .= '-';
        $guid .= create_guid_section(4);
        $guid .= '-';
        $guid .= create_guid_section(4);
        $guid .= '-';
        $guid .= $sec_hex;
        $guid .= create_guid_section(6);

        return $guid;

    }
    function create_guid_section($characters)
    {
        $return = "";
        for($i=0; $i<$characters; $i++)
        {
            $return .= dechex(mt_rand(0,15));
        }
        return $return;
    }

    function ensure_length(&$string, $length)
    {
        $strlen = strlen($string);
        if($strlen < $length)
        {
            $string = str_pad($string,$length,"0");
        }
        else if($strlen > $length)
        {
            $string = substr($string, 0, $length);
        }
    }

现在使用上述功能,您可以生成id:

$guid = create_guid(); //guid is of the format 79cb3604-e634-a142-d9cb-5113745b31e2 which you can see is quite impossible to guess.

另外,我会认为您在产品表中保留了自动增量字段。 因为在表中维护一个自动递增的字段以唯一地标识记录总是一个好主意。

我希望这可以提供一些帮助

编辑:

您需要做的是在数据库产品表中添加一个名为“guid”的字段 所以说你当前的数据库产品表结构有以下字段:

id, name, price  //where id is the auto incremented

添加字段guid后,它变为

id, guid, name, price //where id is auto incremented field and guid uniquely identifies each row in the product table

当您在数据库产品表中插入产品数据时,使用上面的代码生成guid并插入它。即

例如

$sql = "Insert into product_table('guid','product_name',product_price) values('".$guid."','product1','59.00');

所以产品表中的示例数据如下所示:

1, 79cb3604-e634-a142-d9cb-5113745b31e2, product1, 59.00

现在在product.php页面中输入url

yoursite.com/product.php?guid=79cb3604-e634-a142-d9cb-5113745b31e2

而不是使用网址

yoursite.com/product.php?id=1

您可以轻松地查询数据库产品表中与“guid”相关的数据,当然,这也可以通过消除用户在网页的网址中猜测您的ID的风险来唯一地标识数据库中产品表中的每一行

我希望这可以让你了解我想要解释的内容。

答案 1 :(得分:0)

使用.htaccess,将“www.example.com/item.php?id=1”重写为“www.example / item.php”是不可能的,因为我们怎么知道,有一个像“www。 example / item.php“,如果产品ID为1或2?不可能。所以,使用.htaccess,这是不可能的。

然而,即使它不是一个好的解决方案,你也可以欺骗和使用PHP和会话变量进行重写。所以,让你的链接在他们当前的形状下,使用get id参数,只需添加你的item.php文件,这个条件会将id值保存在会话变量中,如果id参数不是,则重定向到item.php空。