PHP中的fopen()无法解析具有长位置网址的重定向

时间:2018-12-06 08:23:59

标签: php header http-headers fopen

我正在尝试使用fopen()从具有一个或多个(301/302)重定向的链接中打开文件,然后到达具有响应代码200的最终文件。但是,当重定向的URL具有很长的位置标头时,fopen()无法解析它,并且上下文中也缺少位置标头。

让我说明一下...

我们有2个重定向文件:

...://://test.com/redirectionWithShortLocation

<?php
    header("HTTP/1.1 302 Moved Permanently");
    header("Location: https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg?test=abc");

...://://test.com/redirectionWithLongLocation

<?php
    header("HTTP/1.1 302 Moved Permanently");
    header("Location: https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg?test=b1XxGVVdV3DMdWbk67YYy4EEP0WK7f7MRGAneY0Oy6csx7mmVwpZjjN3WyAuoHZffn2JlCOQxXhel77qutdzzMnYmLHt9YNbZqQXPhqyKvEVPNGgrDYoQ6FGhcmI0VOYyTiO2625Y45sb3U3SXYU8G5yfIixn5C5c6o3jNivhmYOhI2JRBjwNzLP6oG0HyYxZkXjxtzOyyNlk7wHqgaEmzIq3KIYuEIFMvpko26x1S2Mw7EBefXBy7Noey0mBxddlt44TTZWd0KeANDqsh2PCqpmrcwrRIOLwlRlH5CP475vS8zavRTNtJq37MnHDep95JEWx0x3OD2HyNRZUDtq0izlAdsiQ6d8CxQMO9DcGGbNoiU9tAH8bfAzca9zUE6iqxNraVMQ7xtfkyCQnS185ig3R2k7kPb4pbUP5UOEvPkEsxIxAvhFeJIPxxGth8XV8yzsymb4GekhQOAsGFhAWqZ6M2tv0ju5aemzPPKuVffzeaaRLyt2Vr06tz2u0SRyyjgLNz2Pjc3G98x1CczwO5EXdE4vh4PyQHxsgnafK8xXyrf5DLepFKCfCyyVS1shh8N7AnsEq3Aeb9HOxYQdB3b3xl2nP30icfrml4IMhm5tFwasKkCbMz7ZLrKkrczbPv0bopbtTdmyQx53Sk00sxb6ShxSFNlmgcMdAR5bntmAbylTzFM5UwWskolU1wU33XZmBOgYy5J49yHxuLyzWXcDu4kwzyq8p9moD34nA9WJZeYBjOLSdCvjqudlqRMxAggceE1PtyBH9WkGZOcVNyEPiDGDxEBkx2hfHYhUZ8nOzEJ3uh9luVjcBwLt7yBGqJlfCO5ymyjzFTN6WISoJEs83f48q4EkxwINJIG2Y3JelOlTvQrIFvBI1lKrmxxIq9RAubwR8PcBQNCN13BOhFqq8aTemqwMsvhWo5IBeSmN6KqxSaeU");

第三个最终的PHP文件试图从链接中打开文件:

<?php
    $url = 'http://test.com/redirectionWithShortLocation';
    //$url = 'http://test.com/redirectionWithLongLocation';

    $context = stream_context_create([
        'http' => [
            'ignore_errors' => true,
            'timeout'       => 3000,
            'follow_location' => 1,
            'max_redirects' => 20,
        ]
    ]);

    $fp       = fopen($url, 'r', false, $context);
    $meta     = stream_get_meta_data($fp);
    $respData = stream_get_contents($fp);
    fclose($fp);

    $responseLines = $meta['wrapper_data'];

    echo "<pre>";
    print_r($responseLines);
    echo "</pre>";
    exit();

因此,当我使用上面的代码打开第一个URL时,我获得了所有标题,并且响应数据正确。但是,当我尝试使用位置标题非常长的第二个URL打开时,$meta['wrapper_data']缺少标题,并且我没有得到正确的响应数据。

我知道我可以通过使用curl打开文件来克服这个问题,但是,如果可能的话,我希望继续使用fopen。

有没有人知道如何在仍然使用fopen的情况下克服此问题/局限性?

0 个答案:

没有答案