Я пытаюсь открыть файл с 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
?