我试图将脉宽调制注册页面(其URL为/pwm/public/newuser)隐藏在现有服务器http://customers.example.com后面的保留路径/register下,以便http://customers.example.com/、http://customers.example.com/shop等页面继续正常工作,而http://customers.example.com/register则被代理到PWM intranet安装。
脉宽调制部署在"http://reg-server:8680/pwm上。
由于该应用程序同时依赖于HTML (即链接和表单操作属性)和引用/pwm/...的javascript内容,所以除了GET和POST请求以及位置响应之外,我还必须操作这两种类型的内容。
下面是我如何配置Apache Httpd VirtualHost (稍后将详细介绍头指令):
ServerName customers.example.com
Header set Server "Apache"
Header append Server Funky
Header append Server Mojo
AddOutputFilterByType SUBSTITUTE application/json
Substitute s|url-context|url-ZZZ|
Header append Server Tango
# ... ProxyPass directives
Header append Server "Apache-3"
# HTML content proxy configuration #
ProxyHTMLEnable On
# Added proxying of 'meta' tag attributes
ProxyHTMLLinks meta data-url-context content
ProxyHTMLLinks a href
...
ProxyHTMLLinks script src for
ProxyHTMLDocType ""
ProxyHTMLCharsetOut *
ProxyHTMLBufSize 16384
ProxyHTMLExtended On
SetOutputFilter INFLATE;proxy-html;DEFLATE
# Replaced, but it seems it's not being used, page refresh is handled by js
ProxyHTMLURLMap "(.*?)=/pwm/public/newuser(.*)" "$1=/register$2" RL
ProxyHTMLURLMap "^/pwm$" "" RLn
ProxyHTMLURLMap "/pwm/public/newuser" "/register" L
ProxyHTMLURLMap "/public/newuser" "/register" L
ProxyHTMLURLMap "/pwm" "" L
ProxyHTMLURLMap "PWM_MAIN.submitPostAction('newuser', 'reset')" "PWM_MAIN.submitPostAction('registrazione', 'reset')" L问题是那个指令
Substitute s|url-context|url-ZZZ|不是被尊重,因为呼吁
/public/api?processAction=clientData&etag=27...生成以下JSON内容:
{ ... "url-command":"/pwm/public/command","url-context":"/pwm","url-logout":"/pwm/public/logout", ... }尽管周围的Header append ...是这样的,因为在服务器响应头中,我可以看到:
Server: Apache, Funky, Mojo, Tango当我将国防部_代理_html指令放在和行中时,问题就出现了。
事实上,如果我把它们注释掉,我就能看到:
{ ... "url-command":"/pwm/public/command","url-ZZZ":"/pwm","url-logout":"/pwm/public/logout", ... }我刚接触过Httpd,我不知道我的配置有什么问题,我甚至尝试用正则表达式指定路径:
但什么都没变。
这种情况发生在2.4.33
发布于 2018-06-08 07:47:15
问题是Httpd (我无法判断它是默认的还是从现有的配置)压缩响应体,所以试图将任何正则表达式应用于压缩HTML并不匹配任何东西(也没有给出任何错误或提示)。
在前一种配置中,HTML内容替换是通过以下指令实现的:
SetOutputFilter INFLATE;proxy-html;DEFLATE当然,在我将所有mod_proxy_html指令移到中之后,SetOoutputfilter在/public/api路径上就不再是活动的了。
因此,我将内容改写如下:
SetOutputFilter INFLATE;DEFLATE
AddOutputFilterByType SUBSTITUTE application/json
Substitute s|"(url-[^:]+)"\s*:\s*"/pwm(/?)([^,\}]*)"|"$1":"/$3"|q这一切又开始了--在这个位置上没有活动的HTML编辑指令,所以我忽略了proxy-html过滤器。
接受答案 to Apache代理导致错误_内容_解码_失败错误在这方面提供了帮助。
https://serverfault.com/questions/915643
复制相似问题