Размер поля заголовка запроса превышает лимит сервера из-за множества значений If-None-Match

8

Вот интересный случай, когда клиент получает ошибку «400 Bad Request» и, по-видимому, не может просмотреть домашнюю страницу drupal, размещенную на Ubuntu 12.04.3 LTS, с использованием Apache / 2.2.22:

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

Вывод сниффинга пакетов:

...
T 2013/09/02 15:23:10.458167 ###.###.###.###:40027 -> ###.###.###.###:80 [A]
GET / HTTP/1.0.
If-None-Match: "1363160742-0", "1363165573-1", "1363175854-1", "1363175854-0", "1363179616-0", "1363181811-0", "1363239319-1", "1363255903-0", "1363259282-0", "1363263398-1", "1363274564-0", "1363329642-0", "1363332613-1", "1363333851-0", "1363599826-0", "1363678909-0", "1363684227-1", "1363699732-0", "1363755181-0", "1363765691-1", "1363767178-0", "1363780208-0", "1363787589-0", "1363795259-1", "1363852409-1", "1363863225-1", "1363928115-0", "1363951793-0", "1363951793-1", "1364133610-1", "1364187608-1", "1364187608-0", "1364203083-0", "1364208174-0", "1364214930-0", "1364219815-0", "1364274441-1", "1364280930-0", "1364280930-1", "1364286055-1", "1364298840-0", "1364298840-1", "1364360674-0", "1364364356-1", "1364381508-0", "1364385520-1", "1364460734-0", "1364882595-1", "1364903271-0", "1364967946-0", "1364967946-1", "1364981713-0", "1364985142-1", "1364992835-1", "1365061578-0", "1365065290-1", "1365076128-0", "1365141088-1", "1365167701-0", "1365171024-0", "1365402404-1", "1365402404-0", "1365411731-1", "1365416882-0", "1365476715-0", "1365487578-0", "1365488880-1", "1365503922-1", "1365514224-1", "1365579101-0", "1365580320-0", "1365582817-0", "1365584926-0", "1365589524-0", "1365608307-0", "1365649987-0", "1365682295-0", "1365685083-0", "1365770532-1", "1365770532-0", "1365844566-0", "1365996619-1", "1366093719-1", "1366093719-0", "1366115408-0", "1366180275-1", "1366186431-0", "1366196476-0", "13662669
...

На этом этапе я не уверен на 100%, ограничен ли он конкретным клиентом, но пользователь сообщил об ошибке следующую строку агента пользователя:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/534.57.7 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.7

Теперь остается вопрос: что делать, проблема с сервером или просто плохо работающий клиент?

inetpro
источник
Это не вопрос Ubuntu. Посмотрите журналы Apache и используйте их для получения помощи среди специализированного сообщества.
Луис де Соуза
Я думал, что это может быть проблема по умолчанию Ubuntu.
inetpro
1
Мы говорим о веб-сервере, работающем в Ubuntu, поэтому он не является не по теме. Как подсказал @ LuísdeSousa, посмотрите /var/log/apache2/error.log, какой предел был нарушен.
Гюнтберт
@ LuísdeSousa Мы поддерживаем все части Ubuntu Server здесь. Почему это не вопрос Ubuntu?
Элия ​​Каган
@ Guntbert интересная часть в том, что ни запрос, ни фактическая ошибка никогда не регистрируются в журналах Apache. Он зарегистрирован в обратном прокси-сервере squid, и я предполагаю, что прокси на самом деле причина
inetpro

Ответы:

11

Вы нашли проблему. Некоторые пользовательские агенты и некоторые запросы просто становятся слишком большими для значений по умолчанию веб-сервера. Кажется, это глупая проблема, с которой я сталкиваюсь nginx. Обычно, когда происходят глупые имена и загрузки файлов cookie ... Во всяком случае ...

Решение состоит в том, чтобы просто увеличить лимит запросов. Вы можете сделать это глобально или просто для своего сайта с помощью LimitRequestFieldSizeдирективы :

LimitRequestFieldSize 32768

Это ограничение 32 КБ (больше, чем по умолчанию 8 КБ).

Оли
источник
Это то, о чем я думал, но я не был уверен в рекомендуемом размере. Спасибо!
inetpro
1
Увеличение LimitRequestFieldSizeдо 32768не поможет.
inetpro
@inetpro Вы перезапустили Apache? И это в достаточно высоком контексте? Это не будет работать в файле .htaccess.
Оли
1
Вы поместили запись в определенный виртуальный хост на основе имени или в другой? Документация говорит: «Когда имя на основе виртуального хостинга используются, значение этой директивы берется из значения по умолчанию (первый в списке) виртуальный хост для NameVirtualHost соединение было сопоставлено с.». Похоже, вам лучше сделать это в глобальной конфигурации. Проблема с выполнением этого на виртуальном хосте заключается в том, что в самом заголовке запроса содержится имя требуемого виртуального хоста.
Роби Басак
2
LimitRequestFieldSize 65536LimitRequestLine 65536LimitXMLRequestBody 0⓸ ??? User Ꭲ☕