需求:
检查网址是否存在有很多种方式方法,但由于图片服务器采用了referer防盗链处理,所以限制了一些简单的方法。以下就是检查网址是否存在的函数
在apache的.htaccess上处理
如果这里想使用302跳转也可以
剩下的就是逻辑问题了。逻辑没有什么好说的,只是最后有一个小问题,需要注意一下。
如果没有找到图片的话怎么处理的问题。
这里有两种方案
这个功能的实现,我在很早的时候,大概10年前就想做这个的想法,但一直不知道怎么做,现在终于实现了,开心。
最后通过html源码发现,我的网址显示的依旧是原始的网址。
有一个问题需要注意,如果通过浏览器的调试工具,依然可以看到图片的真实地址。
如果走代理通道,即让所有的流量通过代理,也可以让图片显示成最初的地址,但是长期来看,服务器流量可能不够用,或者流量支出比较高,这个暂时不考虑。以后的话,可能会有这方面的考虑。
如果通过服务器做中间的代理,就可以使用另一个方案,具体实现
- 网站图片储存在不同的amazon s3上,因为各方面的考虑,amazon s3的图片服务器设置成了服务器1,服务器2。其中服务器1存储不超过90天的内容,服务器2作为存档服务器,存储在服务器1上超过90天的内容。amazon s3做了referer防盗链处理。
网站图片需要通过统一网址访问,但又不能让服务器做代理,走服务器流量。(VPS流量费超过后很贵,虽然暂时服务器流量比较低,但为了防止以后流量问题,就做这个要求)
要实现这个要求,主要有三个步骤。
检查网址是否存在。
检查网址是否存在有很多种方式方法,但由于图片服务器采用了referer防盗链处理,所以限制了一些简单的方法。以下就是检查网址是否存在的函数
function check_remote_file_exists($url) {
$curl = curl_init($url); // 不取回数据
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); // 发送请求
curl_setopt($curl, CURLOPT_REFERER, "https://www.yeniugo.com/");//添加referer
$result = curl_exec($curl);
$found = false; // 如果请求没有发送失败
if ($result !== false) {
/** 再检查http响应码是否为200 */
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($statusCode == 200) {
$found = true;
}
}
curl_close($curl);
return $found;
}
让所有的网络请求通过一个文件处理
在apache的.htaccess上处理
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} image.yeniugo.com$
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
301跳转
header('HTTP/1.1 301 Moved Permanently');//发出301头部
header('Location: '.$url);//跳转到你希望的地址格式
如果这里想使用302跳转也可以
header('Location: '.$url);//跳转到你希望的地址格式
逻辑思考
剩下的就是逻辑问题了。逻辑没有什么好说的,只是最后有一个小问题,需要注意一下。
如果没有找到图片的话怎么处理的问题。
这里有两种方案
- 返回404错误
- 返回404错误图片,如果选择这种方式,从用户体验而言是比较友好的方式,但由于这里图片可能经常遇到404问题,所以建议是把这个404图片上传到一个免费的服务器上面。这里选择比较多,就不在这里一一说明了。
总结
这个功能的实现,我在很早的时候,大概10年前就想做这个的想法,但一直不知道怎么做,现在终于实现了,开心。
最后通过html源码发现,我的网址显示的依旧是原始的网址。
有一个问题需要注意,如果通过浏览器的调试工具,依然可以看到图片的真实地址。
Request URL
就是该文件的真实地址。如果走代理通道,即让所有的流量通过代理,也可以让图片显示成最初的地址,但是长期来看,服务器流量可能不够用,或者流量支出比较高,这个暂时不考虑。以后的话,可能会有这方面的考虑。
如果通过服务器做中间的代理,就可以使用另一个方案,具体实现
评论
发表评论