CORS代理(php)无法连接到端口

CORS代理(php)无法连接到端口,php,proxy,cors,Php,Proxy,Cors,当我在浏览器地址栏中请求时,我正确地收到了元数据 在我的应用程序中,由于CORS问题,对给定路径的请求失败。我无法访问服务器来修改标题,因此我正在尝试使用PHP创建CORS代理 <?php if( ! isset($curl_timeout)) $curl_timeout = 30; $headers = getallheaders(); $method = __('REQUEST_METHOD', $_SERVER); $url = $_GET['url']; // Chec

当我在浏览器地址栏中请求时,我正确地收到了元数据

在我的应用程序中,由于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;
}
三件事

  • 服务器端调用不受跨源请求策略的约束 除非您要将“来源””标题添加到请求中

  • 您不需要在curl请求中设置端口<代码>CULLOPT_端口=>4101,这不是必需的

  • 当您调用此url
    http://fmgold.mvserver.be:4101/7.html
    在浏览器中,不涉及“来源””标题,您可以 通过向其发出GET请求进行响应

    但在服务器端,当您发出请求时, 您要做的是获取服务器头
    $headers=getallheaders()
    并在curl请求中设置所有这些
    CURLOPT\u HTTPHEADER=>$headers,
    并执行它

    我的假设是,
    $headers
    包含“Origin”头和 由于此原因,主机服务器正在拒绝您对CORS的请求

    删除此
    CURLOPT\u HTTPHEADER=>$headers,
    ,然后重试。它应该 工作


  • 您的代码似乎没有问题。作品完美,输出“1,1,10,10,1,64,CLAUDIA JUNG&CLAYDERMAN-我爱你”。可能是他们服务器上的临时故障?如果CORS阻止这个端口,你不太可能做到,becos启用CORS的唯一原因是为了避免这些类型的不可信安全问题locations@mahen3d通过使用部署为heroku应用程序的cors anywhere解决方案,我成功地实现了检索目标url的内容(请参阅)。因此,我试图在我的服务器上用PHP实现同样的目标。所以这应该是可能的,对吧?@ElFred你怎么知道它的CORS导致了“连接被拒绝”,因为“连接被拒绝”可能有很多不同的原因。你能发布错误日志证明问题与CORS有关吗?(似乎有人对CORS的所有问题和答案给出-1,StackOverflow应该禁止这个。)