【问题标题】:CORS proxy (php) fails to connect to portCORS 代理 (php) 无法连接到端口
【发布时间】: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应该禁止这个。)

标签: php proxy cors


【解决方案1】:

三件事,

  1. 服务器端调用不受跨域请求策略的约束 除非您在请求中添加“Origin”标头

  2. 你不需要在 curl 请求中设置端口。 CURLOPT_PORT =&gt; 4101, 这不是必需的

  3. 当您调用此网址时http://fmgold.mvserver.be:4101/7.html 从浏览器中,不涉及“Origin”标头,您会得到 通过向其发出 GET 请求来响应。

    但是在服务器端,当您发出请求时, 你正在做的是,你正在获取服务器头 $headers = getallheaders(); 并将它们全部设置在你的 curl 请求中 CURLOPT_HTTPHEADER =&gt; $headers, 并执行它。

    我的假设是 $headers 包含 'Origin' 标头和 主机服务器因此拒绝您对 CORS 的请求

    删除此CURLOPT_HTTPHEADER =&gt; $headers, 并尝试。这应该 工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多