PHP Query String Limit - PullRequest
       7

PHP Query String Limit

3 голосов
/ 03 февраля 2009

У меня установлен PHP 5.1.6 (cli), и всякий раз, когда строка запроса GET содержит более 128 символов, она завершается с ошибкой HTTP 406 Not Acceptable. Любые предложения, как я могу это исправить, чтобы можно было использовать более 128 символов? POST не вариант.

Ошибка возвращается сервером, поэтому не думайте, что это проблема браузера. И причина, по которой я думаю, что это PHP, а не Apache, заключается в том, что он отлично работает с HTML-файлом.

GET /test.php?phptestof129characterstring-NEW-WOVEN-FENCE-PANELS-GARDEN_W0QQitemZ200303392512QQihZ010QQcategoryZ139954QQtcZphotoQQcmdZViewItem
HTTP/1.1
Host: *****
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: agent_name=Tim

HTTP/1.1 406 Not Acceptable
Date: Tue, 03 Feb 2009 12:05:33 GMT
Server: Apache/2.2.3 (Red Hat)
X-Powered-By: PHP/5.1.6
Content-Length: 0
Connection: close
Content-Type: text/html

GET /test.html?phptestof129characterstring-NEW-WOVEN-FENCE-PANELS-GARDEN_W0QQitemZ200303392512QQihZ010QQcategoryZ139954QQtcZphotoQQcmdZViewItem
HTTP/1.1
Host: *****
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: agent_name=Tim

HTTP/1.1 200 OK
Date: Tue, 03 Feb 2009 12:18:19 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Fri, 19 Dec 2008 15:01:17 GMT
ETag: "156960d-221-94be8940"
Accept-Ranges: bytes
Content-Length: 545
Connection: close
Content-Type: text/html

Ответы [ 4 ]

2 голосов
/ 03 февраля 2009

У вас на веб-сервере включена mod_security ? Это звучит как то, что он будет делать. Если это так, вы можете отключить локально внутри блока <VirtualHost> или с помощью файла .htaccess для v1.x

<IfModule mod_security.c>
SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>

Версия 2.x имеет другой синтаксис конфигурации:

<IfModule mod_security2.c>
    SecRuleEngine Off
</IfModule>

Это немного грубый подход, вы можете прочитать документацию , чтобы узнать, как можно разрешить прохождение определенных URI. См. Также Обработка ложных срабатываний и создание пользовательских правил

0 голосов
/ 03 февраля 2009

Нашли ответ благодаря комментарию от Бена.

Хотя при этом возникает ошибка 406: test.php? 129 + символов

Это прекрасно работает: test.php? Данные = 129 + символов

Так что я предполагаю, что в первом случае PHP пытается использовать 129 символов в качестве имени в массиве $ _GET, тогда как во втором примере для имени используется только 4 символа, а остальные назначаются в качестве значения, поэтому массив должен иметь 128 ограничение на количество символов в имени индекса.

0 голосов
/ 03 февраля 2009

Это длинный выстрел, но попробуйте добавить:

header('Content-Type: text/html');

к вашему серверному коду. Если это не помогает, проверьте конфигурацию Apache, возможно, она неправильно настроена, чтобы файлы PHP не могли выдавать текстовый / html MIME-тип. Если это не поможет, как насчет настройки Apache, чтобы файлы .html обрабатывались как PHP и переименовывали целевой скрипт в .html?

Кстати, от http://www.checkupdown.com/status/E406.html:

Клиент (например, ваш веб-браузер или наш робот CheckUpDown) может указать веб-серверу характеристики данных, которые он будет принимать обратно с веб-сервера. Это делается с использованием «заголовков принятия» следующих типов:

  • Принять: типы MIME, принятые клиентом. Например, браузер может принимать только назад типы данных (файлы HTML, файлы GIF и т. Д.), Которые он знает, как обрабатывать.
  • Accept-Charset: наборы символов, принятые клиентом.
  • Accept-Encoding: кодировка данных, принятая клиентом, например. форматы файлов, которые он понимает.
  • Accept-Language: естественные языки (английский, немецкий и т. Д.), Принятые клиентом.
  • Accept-Ranges: принимает ли клиент диапазоны байтов от ресурса, то есть части ресурса.

Если веб-сервер обнаруживает, что данные, которые он хочет вернуть, неприемлем для клиента, он возвращает заголовок, содержащий код ошибки 406.

0 голосов
/ 03 февраля 2009

В качестве обходного пути, вы можете попробовать использовать Javascript, чтобы поместить данные в куки. Файлы cookie будут отправляться автоматически при каждом запросе GET и предоставят вам дополнительные 2 КБ пространства данных (если я не ошибаюсь).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...