PHP中隐藏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

