Я пытаюсь создать сайт 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