php实现文件隐藏服务器真实地址(一)

php实现文件隐藏服务器真实地址(一)

需求:

  1. 网站图片储存在不同的amazon s3上,因为各方面的考虑,amazon s3的图片服务器设置成了服务器1,服务器2。其中服务器1存储不超过90天的内容,服务器2作为存档服务器,存储在服务器1上超过90天的内容。amazon s3做了referer防盗链处理。

  2. 网站图片需要通过统一网址访问,但又不能让服务器做代理,走服务器流量。(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);//跳转到你希望的地址格式

逻辑思考

剩下的就是逻辑问题了。逻辑没有什么好说的,只是最后有一个小问题,需要注意一下。
如果没有找到图片的话怎么处理的问题。
这里有两种方案

  1. 返回404错误
  2. 返回404错误图片,如果选择这种方式,从用户体验而言是比较友好的方式,但由于这里图片可能经常遇到404问题,所以建议是把这个404图片上传到一个免费的服务器上面。这里选择比较多,就不在这里一一说明了。

总结

这个功能的实现,我在很早的时候,大概10年前就想做这个的想法,但一直不知道怎么做,现在终于实现了,开心。
最后通过html源码发现,我的网址显示的依旧是原始的网址。
有一个问题需要注意,如果通过浏览器的调试工具,依然可以看到图片的真实地址。
Request URL就是该文件的真实地址。
如果走代理通道,即让所有的流量通过代理,也可以让图片显示成最初的地址,但是长期来看,服务器流量可能不够用,或者流量支出比较高,这个暂时不考虑。以后的话,可能会有这方面的考虑。
如果通过服务器做中间的代理,就可以使用另一个方案,具体实现

发表评论

电子邮件地址不会被公开。 必填项已用*标注