0

我想知道是否可以重写一个看起来像这样的 url

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 的忠实粉丝

4

2 回答 2

3

由于您在这里的主要动机是让人们猜测 url 中的 id,并且正如lucas william所指出的那样,您想要的方式在 .htaccess 中是不可能的,因此您可以将每个产品的 id 作为 guid 格式存储在数据库中( SugarCRM使用这种将 id 存储到数据库中的格式),这也是满足您所需的适当替代品,您可以使用该 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 并将其插入。IE

例如

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

因此您的产品表中的示例数据将如下所示:

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

现在在带有 url 的 product.php 页面中说

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

而不是使用网址

yoursite.com/product.php?id=1

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

我希望这能让您了解我要解释的内容。

于 2013-07-15T17:28:36.277 回答
0

使用 .htaccess,将 "www.example.com/item.php?id=1" 重写为 "www.example/item.php" 是不可能的,因为我们怎么知道,使用像 "www.example/item" 这样的 url .php”,如果产品 id 是 1 或 2 ?不可能。因此,使用 .htaccess 是不可能的。

但是,您可以作弊并简单地使用 PHP 和会话变量来进行这种重写,即使这不是一个好的解决方案。因此,让您的链接处于当前形状,使用 get id 参数,只需在 item.php 文件中添加一个条件,该条件会将 id 值保存在会话变量中,如果 id 参数不是,则重定向到 item.php空的。

于 2013-07-15T09:51:02.587 回答