You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中隐藏URL内product-id参数并获取产品信息的方案咨询

解决方案:隐藏URL中的Product ID同时保证产品唯一识别

嗨,针对你不想在URL里暴露product-id,但又要避免产品名称重复导致查询出错的问题,我整理了几个实用的方案,你可以根据自己的业务场景选择:

1. 在产品Slug后追加隐藏的ID(最推荐)

把URL改成 www.website-name.com/product/product-name-123,这里的123就是你的product-id,但它跟在产品名称后面,用户几乎不会注意到,同时URL依然保持友好易读。

在PHP里,你可以轻松提取这个ID:

// 获取当前URL的最后一段(slug)
$slug = basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
// 用正则匹配末尾的数字ID
if (preg_match('/-(\d+)$/', $slug, $matches)) {
    $productId = $matches[1];
    // 现在用$productId去数据库查询产品信息
}

这个方案的好处是:URL美观、用户体验好,完全不影响你用ID做精准查询,也不用额外存储数据,几乎没有缺点。

2. 用Session/Cookie传递ID

当用户从产品列表页点击进入详情页时,先把product-id存入Session或Cookie,再跳转到不带ID的URL(www.website-name.com/product/product-name)。在详情页直接从$_SESSION或$_COOKIE里取ID即可:

// 列表页点击产品时的跳转代码
$_SESSION['current_product_id'] = $productId;
header('Location: /product/' . $productSlug);

// 详情页获取ID的代码
if (isset($_SESSION['current_product_id'])) {
    $productId = $_SESSION['current_product_id'];
    // 查询产品信息
}

⚠️ 注意:这个方案的问题是,如果用户直接输入产品URL(不是从列表页跳转),Session里没有ID就会失效。所以可以搭配方案1做 fallback,或者用Cookie设置较长有效期(记得开启HttpOnly和Secure属性保障安全)。

3. 加密ID为Token放在URL参数中

把product-id加密成一个无意义的Token,放在URL的查询参数里,比如www.website-name.com/product/product-name?token=abcdef12345。用户看不到真实ID,你在PHP里解密Token就能拿到ID:

// 加密ID的函数(示例用AES-256-CBC)
function encryptId($id, $key) {
    $iv = random_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt($id, 'aes-256-cbc', $key, 0, $iv);
    return base64_encode($encrypted . '::' . $iv);
}

// 解密Token的函数
function decryptToken($token, $key) {
    list($encryptedData, $iv) = explode('::', base64_decode($token), 2);
    return openssl_decrypt($encryptedData, 'aes-256-cbc', $key, 0, $iv);
}

// 详情页使用
if (isset($_GET['token'])) {
    $productId = decryptToken($_GET['token'], '你的加密密钥');
    // 查询产品信息
}

这个方案的好处是完全隐藏真实ID,但需要注意密钥的安全管理,还要处理解密失败的情况(比如用户篡改Token)。

4. 用唯一短码映射ID

在数据库里给每个产品新增一个short_code字段,生成唯一的、友好的短码(比如用Base62编码ID,或者UUID),然后URL改成www.website-name.com/product/abc123。通过短码查询数据库拿到对应的product-id:

// 生成短码的示例(Base62编码)
function idToShortCode($id) {
    $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $shortCode = '';
    while ($id > 0) {
        $shortCode .= $chars[$id % 62];
        $id = intval($id / 62);
    }
    return strrev($shortCode);
}

// 详情页查询
$shortCode = basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
$product = $db->query("SELECT * FROM products WHERE short_code = '$shortCode'")->fetch();
$productId = $product['id'];

这个方案的URL最简洁,但需要额外维护short_code字段,确保唯一性(可以在插入产品时自动生成)。


内容的提问来源于stack exchange,提问作者Nasser Hajlawi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:32:41