PHP中移除URL的?和=并获取category_slug的方法求助
解决方法
方法一:URL重写(更推荐)
这种方式能保留你想要的美观URL格式,同时让PHP可以用常规的GET方式获取参数。
1. 配置Apache重写规则(通过.htaccess)
在网站根目录新建或修改.htaccess文件,添加以下规则:
RewriteEngine On # 将 category.php/xxx 格式的URL,内部转换为 category.php?category=xxx RewriteRule ^category\.php/([^/]+)$ category.php?category=$1 [L,QSA]
简单来说:浏览器地址栏显示category.php/数码产品,服务器内部会把它当作category.php?category=数码产品处理,用户不会看到这个转换过程。
2. 在category.php中获取参数
现在直接通过$_GET就能拿到分类slug,记得先判断参数是否存在,避免报错:
if (isset($_GET['category'])) { $category_slug = $_GET['category']; // 后续用该slug查询数据库,示例: // $stmt = $pdo->prepare("SELECT * FROM products WHERE category_slug = ?"); // $stmt->execute([$category_slug]); // $products = $stmt->fetchAll(); } else { // 处理未传入slug的情况,比如显示全部分类或提示用户选择分类 }
方法二:直接解析URL路径(无需修改服务器配置)
如果不想折腾服务器配置,也可以直接从URL中提取slug:
// 获取当前请求的完整路径 $request_path = $_SERVER['REQUEST_URI']; // 用正则匹配 category.php/ 后面的内容 preg_match('/category\.php\/([^\/]+)/', $request_path, $matches); if (isset($matches[1])) { $category_slug = $matches[1]; // 同样要对参数做安全处理后再查询数据库 } else { // 处理无slug的情况 }
注意:这种方式对URL格式要求严格,若后续添加其他参数(如category.php/数码产品?page=2),需要调整正则表达式,灵活性不如重写方法。
额外提醒
- 若使用Nginx服务器,重写规则需写在Nginx配置文件中,示例如下:
location / { rewrite ^/category\.php/([^/]+)$ /category.php?category=$1 last; } - 拿到
$category_slug后必须做安全过滤,比如使用数据库预处理语句,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者swati mathur
相关产品推荐
相关产品推荐

