Искаженный текст при включении удаленного файла.shtml с использованием mod_include и mod_proxy
Я экспериментирую с apache mod_include.
У меня есть два сервера под управлением Apache: я пытаюсь включить в свой test_local.shtml (server1) простой текст из test_remote.shml (server2).
test_local.shtml:
<html>
<head>
<title></title>
</head>
<body>
<!--#include virtual="http://www.server2.com/test_remote.shtml"-->
</body>
</html>
test_remote.shtml:
<b>this is a test</b>
Сначала это не сработало (в файле error_log появилась ошибка "Файл не существует"). Похоже, что из соображений безопасности единственные файлы, которые мне удается включить, находятся на моем локальном сервере (server1) с локальным путем, но не с удаленным URL. Затем я понял, что мне нужно использовать mod_proxy (и mod_proxy_html) в сочетании с mod_include для работы удаленного включения.
Поэтому я добавил следующее в мой httpd.conf (на server1):
ProxyPass /server2 http://www.server2.com
Затем я изменил строку включения в test_local.shtml на:
<!--#include virtual="/server2/test_remote.shtml"-->
На этот раз ошибок нет, что-то включается, но полученный текст искажен:
‹³I²+ÉÈ,V¢D…’Ôâý$;.j¿è
Я что-то упустил в своей конфигурации? В чем дело?
ОБНОВЛЕНИЕ: Я подозреваю, что это что-то вроде способа передачи данных (а затем их чтения) между двумя серверами.. например, сжатие или подобное. Я проверил раздел конфигурации mod_deflate, который включен и работает на обоих серверах, и он одинаков. Любая идея? Спасибо
ОБНОВЛЕНИЕ 2: отключение SetOutputFilter DEFLATE на сервере server2, текст, включенный в mod_include на сервере server1, отлично читается. Так вот источник проблемы: как я могу настроить server1 для обработки сжатого содержимого и правильного его отображения? (Гипотетически я представляю какой-то входной фильтр в отличие от выходного фильтра..)
1 ответ
Я нашел два решения, но предпочитаю второе, потому что не нужно менять конфигурацию удаленного сервера.
Решение 1:
Добавляя следующее в конфигурацию удаленного сервера, мы отключаем сжатие gzip для файлов.shtml:
<IfModule mod_deflate.c>
SetEnvIfNoCase Request_URI \.shtml$ no-gzip dont-vary
</IfModule>
Это не лучшее решение для меня, потому что у меня не всегда есть доступ к удаленному серверу, с которого я включаю содержимое.
Решение 2:
На "локальном" сервере (тот, на котором размещаются страницы, использующие включение SSI), добавьте следующее:
ProxyPass /server2 http://www.server2.com/
ProxyPassReverse /server2 http://www.server2.com/
<Location "/server2/">
RequestHeader unset Accept-Encoding
</Location>
По сути, я говорю Apache, чтобы отключить заголовок запроса Accept-Encoding; при запросе страниц.shtml на удаленный сервер мы запрашиваем страницу без сжатия. Следовательно, мы получаем простой текст, избегая искаженного содержимого.
Дополнительная информация: http://wiki.apache.org/httpd/ReInflating