核心概念:为什么需要夹带变量?
在竞价场景中,你可能需要通过不同的广告链接,引导用户到同一个网页,但网页需要根据不同的广告来源、关键词、用户ID等,展示不同的内容或执行不同的逻辑。

ad_a.com广告链接到your-site.com/product.php?id=123ad_b.com广告链接到your-site.com/product.php?id=456
这样,当用户访问 your-site.com/product.php?id=123 时,PHP代码就可以获取到 id 的值是 123,然后从数据库中查找并展示ID为123的商品信息。
GET 请求(最常用、最简单)
这是最传统、最直接的方式,变量直接跟在URL的问号()后面,以“键=值”的形式存在,多个变量之间用&符号连接。
URL 格式示例
http://www.your-site.com/page.php?variable1=value1&variable2=value2&campaign_id=abc123
- 标志着查询字符串的开始。
variable1=value1:一个键值对。&:分隔不同的键值对。
在 PHP 中获取变量
PHP提供了全局超全局数组 $_GET 来方便地获取这些变量。

示例代码 (page.php):
<?php
// 1. 安全地获取变量,并设置默认值,防止未定义变量警告
$product_id = isset($_GET['id']) ? $_GET['id'] : '';
$campaign_source = isset($_GET['source']) ? $_GET['source'] : 'direct'; // 默认是直接访问
$utm_campaign = isset($_GET['utm_campaign']) ? $_GET['utm_campaign'] : '';
// 2. 对获取到的变量进行安全处理(非常重要!)
// 在将变量用于数据库查询或输出到HTML之前,必须进行过滤和转义。
$product_id = (int)$product_id; // 强制转换为整数,防止SQL注入
// 3. 使用变量
echo "<h1>产品详情页</h1>";
echo "<p>产品ID: " . htmlspecialchars($product_id) . "</p>";
echo "<p>广告来源: " . htmlspecialchars($campaign_source) . "</p>";
echo "<p>营销活动: " . htmlspecialchars($utm_campaign) . "</p>";
// 4. 根据变量执行逻辑
if (!empty($product_id)) {
// 这里应该是你的数据库查询逻辑
// $sql = "SELECT * FROM products WHERE id = " . $product_id;
// $result = mysqli_query($conn, $sql);
echo "<p>正在从数据库加载ID为 " . $product_id . " 的产品...</p>";
} else {
echo "<p>错误:未指定产品ID。</p>";
}
?>
如何构建这样的链接?
你可以在HTML中直接写,也可以用PHP动态生成。
静态HTML链接:
<a href="page.php?id=123&source=baidu">点击查看产品123</a>
PHP动态生成链接:

<?php $productId = 123; $source = 'google'; $link = "page.php?id=" . urlencode($productId) . "&source=" . urlencode($source); ?> <a href="<?php echo $link; ?>">点击查看产品 <?php echo $productId; ?></a>
注意:使用
urlencode()对值进行编码,可以确保特殊字符(如空格、&、)不会破坏URL结构。
PATHINFO / URL Rewriting(更美观、更专业)
这种方式通过URL的路径本身来传递变量,看起来更简洁,更像一个静态网站,对SEO也更友好,它通常需要Web服务器(如Apache或Nginx)的配置支持。
URL 格式示例
http://www.your-site.com/product/123
或者
http://www.your-site.com/product/123/source/google
这里的 123 和 google 就是我们要传递的变量。
实现步骤
这种方法分两步:1. 服务器配置URL重写;2. PHP代码获取变量。
服务器配置(以Apache为例)
你需要一个 .htaccess 文件放在你的网站根目录下。
.htaccess 文件内容:
# 开启重写引擎
RewriteEngine On
# 如果请求的文件或目录不存在,则进行重写
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 将所有请求重定向到 index.php
# [QSA] 表示保留原有的查询字符串(GET参数)
# [L] 表示这是最后一条规则
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
这个配置会把所有不存在的文件或目录的请求,都交给 index.php 处理,并把原始路径作为 url 参数传递给它。
PHP 代码处理
示例代码 (index.php):
<?php
// 获取完整的PATHINFO路径
// 访问 /product/123/source/google,$url_path 'product/123/source/google'
$url_path = isset($_GET['url']) ? rtrim($_GET['url'], '/') : '';
// 将路径按 '/' 分割成数组
// $path_parts 将会是 ['product', '123', 'source', 'google']
$path_parts = explode('/', $url_path);
// 根据数组的顺序和位置解析变量
// 假设我们的URL格式是 /product/{id}/source/{source}
if (isset($path_parts[0]) && $path_parts[0] == 'product') {
$product_id = isset($path_parts[1]) ? (int)$path_parts[1] : 0;
$source_key = isset($path_parts[2]) ? $path_parts[2] : '';
$campaign_source = isset($path_parts[3]) ? $path_parts[3] : '';
// 如果键名不是 'source',则忽略后续部分
if ($source_key !== 'source') {
$campaign_source = '';
}
// 使用变量
echo "<h1>产品详情页 (PATHINFO)</h1>";
echo "<p>产品ID: " . htmlspecialchars($product_id) . "</p>";
echo "<p>广告来源: " . htmlspecialchars($campaign_source) . "</p>";
// 执行数据库查询等逻辑...
if (!empty($product_id)) {
echo "<p>正在从数据库加载ID为 " . $product_id . " 的产品...</p>";
}
} else {
// 处理首页或其他路由
echo "<h1>欢迎访问首页</h1>";
}
?>
如何构建PATHINFO链接?
这种方式下,链接就是标准的路径。
HTML链接:
<a href="/product/123/source/baidu">点击查看产品123</a>
PHP动态生成链接:
<?php $productId = 456; $source = 'facebook'; $link = "/product/" . urlencode($productId) . "/source/" . urlencode($source); ?> <a href="<?php echo $link; ?>">点击查看产品 <?php echo $productId; ?></a>
方法对比与选择建议
| 特性 | GET 请求 | PATHINFO / URL Rewriting |
|---|---|---|
| URL外观 | page.php?id=123 (有问号,较长) |
/product/123 (简洁,像静态页) |
| SEO友好度 | 较低,搜索引擎可能不喜欢单一页面有大量不同参数 | 较高,URL结构清晰,关键词可包含在路径中 |
| 实现复杂度 | 简单,无需服务器配置,PHP原生支持 | 较复杂,需要配置服务器(如.htaccess) |
| 可读性 | 较差,参数混杂 | 很好,路径结构一目了然 |
| 适用场景 | 后台管理、数据表格筛选、API接口等对URL美观度要求不高的地方 | 公开的、面向用户的网站,尤其是电商、博客、内容型网站 |
安全警告(至关重要!)
无论使用哪种方法,永远不要直接信任和输出用户通过URL提交的数据。
- SQL注入:如果变量用于数据库查询,必须使用预处理语句或对变量进行严格的类型转换(如
(int)$id)。 - XSS跨站脚本攻击:如果要将变量输出到HTML页面,必须使用
htmlspecialchars()函数进行转义。 - 文件包含漏洞:如果变量用于包含文件,绝对不能允许用户控制路径。
- 快速实现、简单场景:直接使用 GET 请求,这是最直接、最快速的方式。
- 构建专业网站、追求SEO:强烈推荐使用 PATHINFO / URL Rewriting,它能让你的网站看起来更专业,对搜索引擎也更友好,虽然前期配置稍显复杂。
对于竞价站来说,两种方法都适用,如果只是简单的参数追踪,GET足够了,如果希望你的落地页URL看起来更正规、更可信,PATHINFO是更好的选择。
