У меня есть рабочий обратный прокси, который активен только в определенном месте на моем сайте, в данном случае, например:www.example.com/reverseproxy/site1
Я использую обратное проксирование site1. Я хочу заменить некоторую часть тела каждой проксируемой страницы, поэтому я попытался использовать mod_substitute, проблема в том, что я не могу заставить его работать под<Location /reverseproxy>
Это мой httpd (SSL включен):
<VirtualHost _default_:443>
ProxyPassInterpolateEnv On
RewriteEngine On
... Some rewrite rules
RewriteRule /?reverseproxy/http(s*):/([^\/]*)/*(.*) "http$1://$2/$3" [P]
SSLProxyEngine On
ProxyPassReverse "/reverseproxy/http${ssl}://${page}" http${ssl}://${page} interpolate
SetOutputFilter INFLATE;proxy-html;SUBSTITUTE;DEFLATE;
ProxyHTMLInterp On
ProxyHTMLExtended Off
...Some ProxyURLMap
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|<body>|<body1>|"
</VirtualHost>
Эта замена работает, но она применяется ко всем страницам, а не только к /reverseproxy
. Когда я пытаюсь поместить его в <Location /reverseproxy>
, он не работает, он просто игнорирует:
<Location /reverseproxy>
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|<body>|<body1>|"
</Location>
Я пытался добавить
RequestHeader unset Accept-Encoding
вне тега <Location>
, но это не сработало
I затем попытался добавить это
SetOutputFilter SUBSTITUTE;DEFLATE
в тег <Location /reverseproxy>
, но безуспешно
И, как кто-то предложил попробовать с этой цепочкой фильтров
FilterDeclare filter
FilterProvider filter SUBSTITUTE "%{CONTENT_TYPE} =~ m|^text/html|"
FilterDeclare unpackGZIP
FilterProvider unpackGZIP INFLATE "resp('Content-Encoding') == 'gzip'"
<Location /reverseproxy>
FilterChain unpackGZIP filter DEFLATE
Все остальное внутри Location работает, просто кажется, что замена игнорируется.
Я рад сообщить, что есть способ обойти проблему интерполяции, по крайней мере, с проблемой подстановки.
Много результатов google для интерполяции с mod_substitute приходят сюда, так что я решил помочь. Это действительно возможно сделать что-то вроде этого:
## These modules are required
LoadModule filter_module modules/mod_filter.so
LoadModule substitute_module modules/mod_substitute.so
LoadModule env_module modules/mod_env.so
## Must be done in vhost directive
<VirtualHost:*:80>
PassEnv HOSTNAME_ENV_VARIABLE_NAME
Define SUBSTITUTE_STRING "s|http://hardcoded-url|http://${HOSTNAME_ENV_VARIABLE_NAME}|i"
<Location /my-path-here-wut-wut/>
AddOutputFilterByType SUBSTITUTE my/mime-type-here
Substitute "${SUBSTITUTE_STRING}"
</Location>
</VirtualHost>
При посещении /my-path-here-wut-wut/
, который возвращает HTML, содержащий http://hardcoded-url
, он будет заменен наhttp://<HOSTNAME_ENV_VARIABLE_NAME>
Единственное решение, которое у меня работало, это:
AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
Источник: