我试图了解为什么我的 Apache 2.4 代理<!doctype html>
在通过 SSL 连接(端口 443)连接时会删除声明,但通过任何其他端口连接时不会删除。
我有 Apache 代理到内部 IIS 服务器。当通过 Apache 调用此页面时,http
我从 Apache 获得的代码与直接从 IIS 调用时获得的代码完全相同。以下是该页面:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Example document</title>
</head>
<body>
<p>Example paragraph</p>
</body>
</html>
但是,如果我通过https
Apache连接<!doctype html>
,声明和<header>
标签会被删除,但内容不会删除;并且会添加一个神秘的空<p> </p>
括号。这是我得到的回报:
<html><body><p>
</p>
<meta charset="UTF-8">
<title>Example document</title>
<p>Example paragraph</p>
</body></html>
我尝试将ProxyHTMLDocType "<!DOCTYPE html>"
and/or添加ProxyHTMLDocType html5
到httpd-ssl.conf
文件 - 但没有效果。(当然,我在进行更改后重新启动了 Apache。)
更多信息
Apache 访问日志
1.2.3.4 - - [02/Apr/2017:11:58:00 -0700] "GET /test.html HTTP/1.1" 200 151
通过执行 直接从 IIS 请求页面http://192.168.1.200:8089/file.html
将按预期返回<!doctype html>...
。如果通过 请求页面,情况也是如此http://example.com:8082/file.html
。但是,奇怪的是,像这样调用它:https://example.com/file.html
<!doctype html>
会被删除。(见上文……)
我在用Apache 2.4
IIS 正在监听:8089
Apache 监听 :80 :8082 和 :443
Apache 2.4 httpd.conf
<VirtualHost *:8082>
ServerName www.example.net:8082
ServerName example.net:8082
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass / http://192.168.1.200:8089/
ProxyPassReverse / http://192.168.1.200:8089/
</IfModule>
</VirtualHost>
Apache 2.4 httpd-ssl.conf 文件
<VirtualHost www.example.net:443>
ServerName www.example.net
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass / http://192.168.1.200:8082/
ProxyPassReverse / http://192.168.1.200:8082/
...
</IfModule>
# --------------------------------------------------
# If I remove this section it works as expected, but
# the page returned includes links that are not rewritten:
# http://192.168.1.200:8082 gets not rewritten to
# https://www.example.net/
#
# this part rewrites the links but drops the DocType
#
<Proxy "http://192.168.1.200:8089">
ProxyHTMLEnable on
ProxyHTMLExtended on
ProxyHTMLMeta On
ProxyHTMLURLMap http://192.168.1.200:8082 https://www.example.net/
</Proxy>
# --------------------------------------------------
</VirtualHost>
更多信息 2
我发现在调用时,error_SSL.log 中会记录一个错误
[Mon Apr 03 18:51:32.821700 2017] [xml2enc:error] [pid 11008:tid 1736] [client 1.2.3.4:4961] AH01435: Charset ISO-8859-1 not supported. Consider aliasing it?
[Mon Apr 03 18:51:32.821700 2017] [xml2enc:warn] [pid 11008:tid 1736] [client 1.2.3.4:4961] AH01436: No usable charset information; using configuration default
我在 IIS 10 管理器默认 HTTP 响应标头中添加了一个新条目,类型为 name: Content-Type
value:,charset=uft-8
只是为了确保 Apache 从 IIS 字符集 uft-8 获取,而不是字符集 ISO-8859-1。我还将其添加ProxyHTMLCharsetOut UTF-8
到代理中。所以现在它显示
<Proxy "http://192.168.1.200:8089">
ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLMeta On
ProxyHTMLCharsetOut UTF-8
# find replace_with
ProxyHTMLURLMap http://192.168.1.105:8082 https://example.com/site1
ProxyHTMLURLMap http://192.168.1.105:8083 https://example.com/site2
ProxyHTMLURLMap http://192.168.1.105:8084 https://example.com/site3
</Proxy>
答案1
我怀疑你的问题是:
<Proxy "http://192.168.1.200:8089">
ProxyHTMLEnable on
ProxyHTMLExtended on
ProxyHTMLMeta On
ProxyHTMLURLMap http://192.168.1.200:8082 https://www.example.net/
</Proxy>
哪个我认为应该读:
<Proxy "http://192.168.1.200:8089">
ProxyHTMLEnable on
ProxyHTMLExtended on
ProxyHTMLMeta On
ProxyHTMLURLMap http://192.168.1.200:8082/ /
</Proxy>
您能否重写httpd-ssl.conf
为:
<VirtualHost www.example.net:443>
ServerName www.example.net
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass / http://192.168.1.200:8089/
ProxyPassReverse / http://192.168.1.200:8089/
...
</IfModule>
并避免通过:8082
代理?还是对请求做了其他事情?
您可能还会发现一些帮助ProxyHTMLURLMap 在 apache2.4 中不起作用