我试图隐藏脉宽调制注册页面(其 URL 为/pwm/public/newuser
)放置在现有服务器 的后面http://customers.example.com
,保留路径 下/register
,这样http://customers.example.com/
,http://customers.example.com/shop
等页面将继续照常工作,同时http://customers.example.com/register
代理到 PWM 内联网安装。
PWM 部署于"http://reg-server:8680/pwm
。
由于该应用程序依赖于 HTML 内容(即链接和表单操作属性)和 javascript 内容引用/pwm/...
我必须操作旁边的两种类型的内容内容得到和邮政 请求和地点回应。
这就是我随后配置的方式Apache HttpdVirtualHost(更多信息标头指令稍后发布):
<VirtualHost *:80>
ServerName customers.example.com
Header set Server "Apache"
<Location "/public/api">
Header append Server Funky
<If "%{QUERY_STRING} =~ /processAction=clientData/">
Header append Server Mojo
AddOutputFilterByType SUBSTITUTE application/json
Substitute s|url-context|url-ZZZ|
Header append Server Tango
</If>
</Location>
# ... ProxyPass directives
<Location "/register">
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 "<!DOCTYPE html>"
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
</Location>
</VirtualHost>
问题是该指令
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
当我将mod_proxy_html<Location "/register">
和</Location>
线内的指令。
事实上,如果我将它们注释掉,我可以看到:
{ ... "url-command":"/pwm/public/command","url-ZZZ":"/pwm","url-logout":"/pwm/public/logout", ... }
我是 Httpd 的新手,我不知道我的配置有什么问题,我甚至尝试用正则表达式指定路径:
<Location ~ "^/public/api">
<Location ~ "^/register">
但什么都没改变。
2.4.33 中发生了这种情况
答案1
问题是 Httpd(我无法判断这是默认设置还是现有配置)压缩响应主体,因此尝试将任何正则表达式应用于压缩 HTML 都无法匹配任何内容(也没有给出任何错误或提示)。
在以前的配置中,可以通过该指令实现 HTML 内容替换:
SetOutputFilter INFLATE;proxy-html;DEFLATE
当然,在我把所有的mod_proxy_html<Location />
该路径上的内部指令SetOoutputfilter
不再有效/public/api
。
因此我重新措辞了<If>
内容如下:
<If "%{QUERY_STRING} =~ /processAction=clientData/">
SetOutputFilter INFLATE;DEFLATE
AddOutputFilterByType SUBSTITUTE application/json
Substitute s|"(url-[^:]+)"\s*:\s*"/pwm(/?)([^,\}]*)"|"$1":"/$3"|q
</If>
一切再次正常运转 — — 此位置没有活动的 HTML 编辑指令,因此我省略了proxy-html
过滤器。
这接受的答案到Apache Proxying 导致 ERR_CONTENT_DECODING_FAILED 错误对此有所帮助。