Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从URL检索文件,并使用相同的头为其提供服务_Php - Fatal编程技术网

Php 从URL检索文件,并使用相同的头为其提供服务

Php 从URL检索文件,并使用相同的头为其提供服务,php,Php,目前,我正在构建一个支持SSL的SMF模块,其中一个问题是用户嵌入的内容(如图像)和其他类型的东西无法从使用SSL的站点获得服务。我正在寻找一种方法来构建一种代理脚本,该脚本将在我的站点上运行,当传递URL时,将检索文件,维护大多数标题(例如mime类型),然后再次为文件提供服务。这样一来,它看起来像是从启用SSL的站点实际提供的映像或其他内容,而实际上并非如此。感谢所有评论!对于那些想在将来这样做的人,以下是我使用的脚本: <?php $requestURL = filter_v

目前,我正在构建一个支持SSL的SMF模块,其中一个问题是用户嵌入的内容(如图像)和其他类型的东西无法从使用SSL的站点获得服务。我正在寻找一种方法来构建一种代理脚本,该脚本将在我的站点上运行,当传递URL时,将检索文件,维护大多数标题(例如mime类型),然后再次为文件提供服务。这样一来,它看起来像是从启用SSL的站点实际提供的映像或其他内容,而实际上并非如此。

感谢所有评论!对于那些想在将来这样做的人,以下是我使用的脚本:

<?php
    $requestURL = filter_var($_REQUEST["url"], FILTER_SANITIZE_URL);
    if(filter_var($requestURL, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED))
    {
        if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
        {
            // Load the headers from the destination server.
            $uri_info = new URIInfo($requestURL);
            if($uri_info->info['filetime'] == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
            {
                header('HTTP/1.1 304 Not Modified');
            }
            else
            {
                //Serve a new copy of the file, its changed :O
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $requestURL);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_FILETIME, 1);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
                $data = curl_exec($ch);
                $info = curl_getinfo($ch);
                curl_close($ch);

                //Display the image in the browser
                header('Content-type: ' . $info['content_type']);
                header('Last-Modified: ' . gmdate('D, d M Y H:i:s \G\M\T', $info['filetime']));
                header('Cache-Control: no-cache'); //Stop CloudFlare!
                echo $data;
            }
        }
        else
        {
            //Just serve the file, they obviously don't have a copy of it!
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $requestURL);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_FILETIME, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
            $data = curl_exec($ch);
            $info = curl_getinfo($ch);
            curl_close($ch);

            //Display the image in the browser
            header('Content-type: ' . $info['content_type']);
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s \G\M\T', $info['filetime']));
            header('Cache-Control: no-cache'); //Stop CloudFlare!
            echo $data;
        }
    }    
    exit();
?>




<?php

    class URIInfo 
    {
        public $info;
        public $header;
        private $url;

        public function __construct($url)
        {
            $this->url = $url;
            $this->setData();
        }

        public function setData() 
        {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $this->url);
            curl_setopt($curl, CURLOPT_FILETIME, 1);
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($curl, CURLOPT_NOBODY, 1);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $this->header = curl_exec($curl);
            $this->info = curl_getinfo($curl);
            curl_close($curl);
        }

        public function getFiletime() 
        {
            return $this->info['filetime'];
        }
    }

?>

我将研究cURL并使用它检索图像及其标题。然后手动设置所需的标题并显示图像。有没有一种方法可以只从服务器请求头?这样,我就可以通过在修改图像时只重新下载图像来最小化服务器使用的带宽,否则就将“未修改”状态代码传递回客户端。或者,我可以将“Last Modified”头从客户端传递到服务器,然后查看服务器是否响应not Modified?尝试
curl_setopt($ch,CURLOPT_头,true)
curl\u setopt($ch,CURLOPT\u NOBODY,true)。不确定,从来没做过。谢谢。我试试看!纯粹出于好奇,您是否知道我在哪里可以找到一个关于如何在PHP中使用cURL的不错的总结?不要千方百计去寻找一个,我只是想知道你是否有一个书签或什么:)这还不够吗?