fopen () в PHP не разрешает перенаправления с длинными URL-адресами - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь открыть файл с fopen() по ссылке, которая имеет одно или несколько перенаправлений (301/302), прежде чем будет достигнут конечный файл с кодом ответа 200.Однако, когда перенаправление имеет заголовок Location с очень длинным URL, fopen() не может его разрешить и заголовок location также отсутствует в контексте.

Позвольте мне проиллюстрировать, что ...

У нас есть 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, который пытается открыть файл по ссылке:

<code><?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 "
"; exit ();

Так что когда яЯ открываю приведенным выше кодом первый URL, я получаю все заголовки, а также данные ответа верны. Однако, когда я пытаюсь открыть второй URL с действительно длинным заголовком местоположения, заголовок отсутствует в $meta['wrapper_data'], и я не получаю правильный ответdata.

Я знаю, что могу преодолеть это, открыв файл с помощью curl, однако я бы хотел остаться с fopen, если это возможно.

У кого-нибудь есть идеи, как решить эту проблему /ограничение при использовании fopen?

...