現在、私は SSL を有効にする SMF mod の構築に取り組んでおり、ポップアップし続ける問題の 1 つは、ユーザーが埋め込んだコンテンツ (画像など) や、SSL を使用するサイトから提供されないその他の種類の問題です。私は、自分のサイトで実行され、URL が渡されたときにファイルを取得し、ほとんどのヘッダー (MIME タイプなど) を維持してから、ファイルを再度提供する一種のプロキシ スクリプトを作成する方法を求めています。このように、実際には SSL 対応のサイトから提供されている画像やその他のもののように見えます。
質問する
114 次
1 に答える
1
コメントありがとうございます!将来これをやりたい人のために、私が使用しているスクリプトを次に示します。
<?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'];
}
}
?>
于 2013-04-06T00:35:30.923 に答える