PHP

Какая может быть максимальная длина URL?

Однажды, при разработке одного из проектов, я столкнулся с тем, что требовалась передача большого количества данных из формы методом GET, то есть через адресную строку. У меня под браузером Firefox все работало как надо, а вот у манагеров, сидящих на Internet Explorer, выдавалась ошибка, что запрошенная страница не может быть отображена. Как оказалось, проблема была в том, что получался слишком длинный адрес URL, и ограничения браузера не позволяют его открыть. Причем у Firefox по всей видимости, этот лимит выше, чем у Internet Explorer. Это натолкнуло меня на мысль протестировать различные браузеры на предмет максимально допустимой длины URL, и вот что у меня получилось. Для опытов был написан коротенький скрипт:
if ($_GET['long']) {
    echo '<script>document.write(document.location.href.length);</script>';
}
else {
    $long=1;
    for ($i=0; $i<23; $i++) {
        $long=ceil(2*$long);
        echo '<a href="test.php?long='.$long;
        echo '#chk='.str_repeat('x',$long).'_end!">'.$long.'</a><br>';
    }
}

Сразу могут возникнуть вопросы: почему в адресе используется именно анкор, а не обычный параметр, и почему для подсчета длины используется JavaScript, а не что-то типа str_len(getenv('REQUEST_URI'))? Да, первый вариант тестового скрипта был именно таким, но я сразу же столкнулся с ограничением сервера Apache на предельно допустимую длину GET-запроса. При обращении к странице сервер выдавал вместо нее ошибку 414 - Request-URI Too Large. Попытки изменить значения параметров LimitRequestLine в конфигурации Apache привели к другой ошибке:

LimitRequestLine "65535" must not exceed the precompiled maximum of 8190

То есть для изменения порогового значения надо перекомпилировать сервер с нужными значениями, а это я сделать не могу, тем более на хостинговом сервере. Пропатчить все проверки в локальной версии сервера тоже не удалось, ограничение все равно оставалось. Поэтому пришлось извернуться через анкор и JavaScript.

Теперь переходим к участникам соревнований. Это Firefox 3.6.24, Firefox 8.0.1, Internet Explorer 8.0, Opera 11.52, Safari 5.1, Chromium 15.0 и Google Chrome 15.0. Сам процесс заключался в том, что я просто открывал по очереди ссылки со страницы в разных браузерах. Под длиной URL подразумевается длина строки от "http://" и до окончания анкора. Результаты тестирования:
Firefox 3.6.24 и Firefox 8.0.1 открыли все ссылки, но после тестового значения 8388608 анкор в адресной строке браузера перестал отображаться.

Internet Explorer 8.0 повел себя совсем неадекватно. При открытии ссылок они принудительно усекались до длины 4121 символ и отображались в адресной строке браузера, соответственно, так же. Более короткие ссылки открылись без проблем.

Opera 11.52 открыла все ссылки без проблем, при отображении даже самых длинных анкоров также никаких замечаний нет.

Safari 5.1 открыл все ссылки до тестового значения 8388608, а на нем вылетел с фатальной ошибкой.

Chromium 15.0 и Google Chrome 15.0 с трудом отрисовали даже исходную страницу, периодически вываливая вместо нее свое "Опаньки...". Проблемы с отображением URL в адресной строке браузера начались с тестового значения 32768. Ссылки же удалось открыть лишь до 1048576, дальше появлялось неизменное "Опаньки...".
Как видите, поведение браузеров значительно отличается, а основное ограничение на размер GET-запроса накладывает сервер Apache. Конечно, вряд ли кто-то захочет передавать мегабайты информации через строку браузера, для этого придуман POST-запрос. Но знать это, мне кажется, будет полезно.
Теги:
URL, Request-URI, LimitRequestLine
Добавлено: 16 Сентября 2013 03:24:09 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...