【发布时间】:2021-07-25 06:28:58
【问题描述】:
当我在浏览器地址栏中向http://fmgold.mvserver.be:4101/7.html 发出请求时,我正确收到了元数据。
在我的应用程序中,由于 CORS 问题,对给定路径的请求失败。我无权访问服务器来修改标头,因此我正在尝试使用 PHP 创建 CORS 代理。
<?php
if( ! isset($curl_timeout))
$curl_timeout = 30;
$headers = getallheaders();
$method = __('REQUEST_METHOD', $_SERVER);
$url = $_GET['url'];
// Check that we have a URL
if( ! $url)
http_response_code(400) and exit("Url missing");
foreach($headers as $key => &$value) {
$value = "$key: $value";
}
$curl = curl_init();
do
{
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_PORT => 4101,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_HEADER => TRUE,
CURLOPT_TIMEOUT => $curl_timeout,
CURLOPT_FOLLOWLOCATION => TRUE
]);
// Method specific options
switch($method)
{
case 'HEAD':
curl_setopt($curl, CURLOPT_NOBODY, TRUE);
break;
case 'GET':
break;
case 'PUT':
case 'POST':
case 'DELETE':
default:
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_POSTFIELDS, file_get_contents('php://input'));
break;
}
// Perform request
ob_start();
curl_exec($curl) or http_response_code(500) and exit(curl_error($curl));
$out = ob_get_clean();
$url = curl_getinfo($curl, CURLINFO_REDIRECT_URL);
}
while($url and --$maxredirs > 0);
$info = curl_getinfo($curl);
curl_close($curl);
// Remove any existing headers
header_remove();
// Use gz, if acceptable
// ob_start('ob_gzhandler');
// Output headers
$header = substr($out, 0, $info['header_size']);
array_map('header', explode("\r\n", $header));
// And finally the body
echo substr($out, $info['header_size']);
// Helper function
function __($key, array $array, $default = null)
{
return array_key_exists($key, $array) ? $array[$key] : $default;
}
我在实时服务器上运行 PHP,但是当我通过代理 php (http://cors-proxy.myliveserver.com/proxy.php?url=http://fmgold.mvserver.be/7.html 调用 url 时,我收到以下错误响应:
Failed to connect to fmgold.mvserver.be port 4101: Connection refused
将端口添加到 curl 请求似乎没有帮助。有什么想法吗?
【问题讨论】:
-
您的代码似乎没有问题。完美运行并输出“1,1,10,10,1,64,CLAUDIA JUNG & CLAYDERMAN - JE T'AIME MON AMOUR”。可能是他们服务器上的临时故障?
-
如果 CORS 阻止此端口的可能性极小,您可以这样做,因为启用 CORS 的唯一原因是避免来自不受信任位置的此类安全问题
-
@mahen3d 我已经通过使用作为 heroku 应用程序部署的 cors-anywhere 解决方案成功地检索了目标 url 的内容(请参阅github.com/Rob--W/cors-anywhere)。所以我试图在我的服务器上使用 PHP 实现相同的目标。所以应该是可以的吧?
-
@ElFred 你怎么知道导致“连接被拒绝”的 CORS,因为“连接被拒绝”可能有很多不同的原因。你能发布证明问题与 CORS 相关的错误日志吗?
-
(好像有人对所有CORS问题和答案都给-1,StackOverflow应该禁止这个。)