Назад | Перейти на главную страницу

ERR_INCOMPLETE_CHUNKED_ENCODING при использовании AddOutputFilterByType в обратном прокси-сервере Apache

Я пытаюсь создать сайт Shopware с помощью Docker за обратным прокси-сервером Apache2. Поскольку ПО Shopware почему-то ставит свой бэкэнд-хост "http://127.0.0.1:18084"в код JavaScript, который он отправляет браузеру, я попытался использовать mod_substitute, чтобы заменить его именем внешнего хоста:

ProxyPass / http://127.0.0.1:18084/
ProxyPassReverse / http://127.0.0.1:18084/

<Location />
    AddOutputFilterByType SUBSTITUTE text/html application/javascript
    Substitute "s!127.0.0.1:18084!my.real.domain.de!in"
</Location>

Это работает, т.е. имя хоста заменяется. Однако некоторые файлы JavaScript отправляются с использованием фрагментированной кодировки, и это вызывает проблемы в браузере (вывод из консоли JS):

GET http://my.real.domain.de/engine/Library/ExtJs/ext-all.js?201611281529 
net::ERR_INCOMPLETE_CHUNKED_ENCODING

Моя первая мысль заключалась в том, что замена испортила длину блоков, но проблема также возникает, когда я удаляю Substitute линия. Просто имея AddOutputFilterByType строка для типа контента application/javascript вызывает проблему.

Обратный прокси-сервер Apache - это версия 2.4.7, серверный apache - это 2.4.18.

Я что-то делаю не так, или это проблема apache? (Были некоторые проблемы с обратным прокси-сервером apache, испорченным последним пустым фрагментом в 2.2, но я думаю, что это должно быть исправлено к настоящему времени)

Обновить:

ezra_s обратил внимание на то, что я должен убедиться, что кеш браузера не влияет на это. Я проверил с помощью curl:

Без AddOutputFilterByTypeи нет SubstituteВ строке host conf файл JS передается полностью (около 1259k байт). Только с AddOutputFilterByTypeлиния включена, я получаю следующий вывод:

here:~ tos$ curl http://my.real.domain.de/engine/Library/ExtJs/ext-all.js?201611281529
/*
This file is part of Ext JS 4.1

Copyright (c) 2011-2012 Sencha Inc

Contact:  http://www.sencha.com/contact

GNU General Public License Usage
This file may be used under the terms of the GNU General Public License version 3.0 as
published by the Free Software Foundation and appearing in the file LICENSE included in the
packaging of this file.

Please review the following information to ensure the GNU General Public License version 3.0
requirements will be met: http://www.gnu.org/copyleft/gpl.html.

If you are unsure which license is appropriate for your use, please contact the sales department
at http://www.sencha.com/contact.

Build date: 2012-07-04 21:11:01 (65ff594cd80b9bad45df640c22cc0adb52c95a7b)
*/
curl: (18) transfer closed with outstanding read data remaining
here:~ tos$ 

Это показывает аналогичное поведение, но показывает, что отсутствует не только конечный фрагмент, но и все, кроме первого фрагмента.

Я проверил это с помощью tcpdump. Он также показывает поступление только одного блока.

Обновление 2:

Похоже, это проблема с mod_substitute. В журнале ошибок моего обратного прокси я нахожу следующую строку:

[Fri Dec 30 11:44:03.934066 2016] [substitute:error] [pid 2725] [client xxx.xxx.xxx.xxx:56492] AH01328: Line too long, URI /engine/Library/ExtJs/ext-all.js

Кажется, что javascript упакован в одну длинную строку, которая слишком длинная для mod_substitute, который терпит неудачу даже до определения замены.

Думаю, я снова открою это как новый вопрос, если не смогу найти решение.

У меня была такая же проблема, и я нашел ответ здесь:

https://bz.apache.org/bugzilla/show_bug.cgi?id=56176

mod_substitute использует ограничение максимальной длины на строку. Если на вашей (неаккуратной) странице строка длиннее этой, модуль внезапно завершает ответ.

Начиная с версии 2.4.11, они добавили новый параметр для управления этим ограничением размера строки.

http://httpd.apache.org/docs/2.4/mod/mod_substitute.html#substitutemaxlinelength