我使用反向代理来显示子域的后端服务器内容。subdomain.mydomain.com(服务器 A)应显示 IP 为 123.123.123.123 端口为 1111 的服务器(服务器 B)的内容。
subdomain.mydomain.com 的虚拟主机(服务器 A):
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName subdomain.mydomain.com
SSLEngine on
SecAuditEngine On
RewriteEngine On
SSLProxyEngine on
ProxyPreserveHost On
LogLevel warn
<Directory />
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<Location />
ProxyPass https://123.123.123.123:1111
ProxyPassReverse https://123.123.123.123:1111
</Location>
ErrorLog /var/log/apache2/error.log
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLVerifyClient none
SSLVerifyDepth 1
SSLCertificateFile /etc/apache2/cert.site/chain_wildcard_site_combined.crt
SSLCertificateKeyFile /etc/apache2/cert.site/key_wildcard_site.key
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</VirtualHost>
</IfModule>
123.123.123.123:1111的虚拟主机(服务器B):
<IfModule mod_ssl.c>
<VirtualHost 123.123.123.123:1111>
DocumentRoot /srv/www/site/htdocs
SSLEngine on
RewriteEngine On
SSLProxyEngine on
ProxyPreserveHost On
LogLevel warn
<Location "/">
Require ip 222.222.222.222
</Location>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /srv/www/site/htdocs>
Options -Indexes +FollowSymLinks +MultiViews
DirectoryIndex index.php
AllowOverride None
Require all granted
</Directory>
ErrorLog /srv/www/site/log/error.log
CustomLog /srv/www/site/log/access.log combined
CustomLog /srv/www/site/log/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLVerifyClient none
SSLVerifyDepth 1
SSLCertificateFile /etc/apache2/cert.site/chain_wildcard_site_combined.crt
SSLCertificateKeyFile /etc/apache2/cert.site/key_wildcard_site.key
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
如果我加载 URL: https://subdomain.mydomain.com/dir/
它加载成功。
如果我加载 URL(不带尾部斜杠): https://subdomain.mydomain.com/dir
它导致错误页面:ERR_CONNECTION_REFUSED。
编辑1:
我执行命令:
curl -IL https://subdomain.mydomain.com/dir
我得到了这个结果:
HTTP/1.1 301 Moved Permanently
Date: Mon, 23 Aug 2021 13:45:13 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000; includeSubDomains
Strict-Transport-Security: max-age=15768000; includeSubDomains
Location: https://subdomain.mydomain.com:1111/dir/
Content-Type: text/html; charset=iso-8859-1
curl: (7) Failed to connect to subdomain.mydomain.com port 1111: Connection refused
编辑2:
我添加了尾部斜杠
<Location />
ProxyPass https://123.123.123.123:1111/
ProxyPassReverse https://123.123.123.123:1111/
</Location>
但我还是明白连接被拒绝错误。
知道为什么缺少尾随斜杠会导致错误吗?
谢谢!
答案1
检查防火墙设置和服务器 B 上的服务器日志,并验证服务器 A 是否能够使用正确的 IP 地址作为发送方(我假设是 222.222.222.222)访问服务器 B。服务器 B 的列表也缺少指令Listen 1111 https
。
编辑 后端服务器正在强制重定向:
HTTP/1.1 301 Moved Permanently
Location: https://subdomain.mydomain.com:1111/dir/
由于 HSTS 标头存在且不存在任何重写规则,因此我认为是应用程序发出了重定向。
验证一下是哪一个。
您说添加“/”后一切正常。mod_rewrite
在前端服务器上强制使用尾随的“/”对我来说似乎是一个可以接受的解决方案。
答案2
答案3
您的反向代理没有(可能不应该)监听端口 1111。
然而,您的 123 服务器正在重定向到端口 1111(根据您发布的配置的假设)。