本文带你了解使用php结合Base64编码与解码来隐藏网站外部URL链接防止被直接爬取的方法。
比如链接中结尾为 ?ur=aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v 是原始网址经过 Base64 编码后的结果。具体技术实现如下:
关于Base64 编码与解码
1. Base64 编码与解码
- 编码过程:原始目标网址(如 ` Base64 格式。Base64 是一种将二进制数据编码为 ASCII 字符串的方法,常用于在 URL 或文本中安全传输特殊字符。
- 解码过程:服务器接收到请求后,会解析
url参数的值,通过 Base64 解码还原原始 URL。例如,aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v解码后即为 https://www.zhaozhao123.cn/
2. URL 重定向技术
- 网站部署了一个重定向服务(例如通过 Nginx、Apache 或自定义脚本)。当用户访问此链接时,服务器会提取
url参数的值,解码后返回 HTTP 302 状态码,将用户跳转到目标页面。 - 这种技术常用于 链接跟踪(统计点击量)、隐藏真实 URL(防止被直接爬取或屏蔽)或 简化长链接。
3. URL 安全性处理
- Base64 编码后的字符串可能包含特殊字符(如
+、/或=),在 URL 中传输时需进一步进行 URL 安全编码(如将+替换为-,/替换为_,并去除填充符=)。但本例中的参数未出现此类替换,说明可能直接使用标准 Base64 编码,由服务器兼容处理。
php代码实现Base64 编码
PHP中将URL进行Base64编码解码的实现方式,php中带有的函数,最简单的方法:
<?php
$url = 'https://www.zhaozhao123.cn/';
$base64 = base64_encode($url);
echo $base64; // 输出:aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v
$url = base64_decode($base64); //输出:https://www.zhaozhao123.cn/
如果需要生成URL安全的Base64编码(替换特殊字符):
<?php
$url = 'https://www.zhaozhao123.cn/';
$base64 = strtr(base64_encode($url), '+/', '-_');
$base64 = rtrim($base64, '=');
echo $base64; // 输出:aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v
说明:
base64_encode()是PHP内置的Base64编码函数- 第二个示例通过
strtr()替换了+和/字符,rtrim()移除了填充的=,使其符合URL安全标准 - 两种编码结果相同是因为该URL长度刚好是3的倍数,不需要填充
=
注意:Base64编码后的数据体积会比原始数据大33%,建议仅对必要内容进行编码。
URL安全的Base64编码与标准Base64编码主要区别
1. 特殊字符替换
标准Base64中的+和/会被替换为-和_。这是因为+和/在URL中具有特殊含义(如路径分隔符或参数分隔符),可能导致解析错误或需要额外转义。替换后可直接嵌入URL而无需二次编码。
2. 填充字符处理
URL安全编码通常省略末尾的=填充符。标准Base64要求数据长度对齐为4的倍数,不足时用=填充,但URL安全版本常直接去除这些填充符以缩短字符串长度。
3. 应用场景差异
- 标准Base64:适用于邮件、文本协议传输二进制数据,但直接用于URL时需额外处理特殊字符。
- URL安全Base64:专为URL设计,如传递令牌、短链等场景,避免因字符冲突导致传输错误。
实现示例(PHP)
function urlSafeBase64Encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
// 示例输出:aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v
注意
不同系统对URL安全Base64的实现可能略有差异,例如是否保留=或替换符号不同,需根据具体需求调整。
php编写URL安全的Base64编码与解码实现
以下是经过优化的URL安全Base64编码与解码PHP实现:
1、编码实现
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
特点:
- 使用
strtr替换+和/字符(比str_replace效率更高) - 通过
rtrim移除填充的=符号 - 输出示例:
aHR0cHM6Ly9leGFtcGxlLmNvbQ(原数据长度非3倍数时会自动省略=)
2、解码实现
function base64url_decode($data) {
$decoded = strtr($data, '-_', '+/');
$decoded .= str_repeat('=', 3 - (3 & strlen($decoded)));
return base64_decode($decoded);
}
特点:
- 通过位运算
3 & strlen快速计算需要补足的=数量(比取模运算更高效) - 兼容带/不带
=的输入数据 - 支持还原原始二进制数据(含图片、文件等)
3、完整使用示例
$original = 'https://www.zhaozhao123.cn/';
$encoded = base64url_encode($original); // aHR0cHM6Ly93d3cuemhhb3poYW8xMjMuY24v
$decoded = base64url_decode($encoded); // 还原原始URL
4、注意事项
- 编码后数据体积增加约33%,建议仅对必要内容编码
- 传输敏感数据时建议结合加密算法(如AES)使用
- 不同系统对
=处理方式可能不同,建议解码时统一补足 - 正则验证模式推荐:
/^[a-zA-Z0-9_-]{4,}$/(排除非法字符)
使用php结合Base64编码与解码来隐藏网站外部URL链接防止被直接爬取的方法你学会了吗?欢迎关注找找网。

