我有一个部署了 Apache 2.4.23 + OpenSSL 1.0.2j 的前端服务器。
然后我有另一台安装了 Tomcat 7 的服务器。
这个想法是 Apache 在 *:443 上有一个 VHOST,它使用 ProxyPass 根据指定的 URL 通过 AJP 将请求发送到 Tomcat 服务器。
这是我的 vhosts.conf 文件(它具有 SSL 配置,因为我不想使用 httpd-ssl.conf 文件,因为我必须在其上更改很多内容),根据此站点:
https://mozilla.github.io/server-side-tls/ssl-config-generator/
##################################################################################################################
# VHOSTS HTTP
# redirect all HTTP to HTTPS (optional)
<VirtualHost *:80>
ServerAlias *
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>
##################################################################################################################
# VHOSTS HTTPS
Listen 443
# modern configuration, tweak to your needs
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLProxyCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:c:/ap24/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
# OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache "shmcb:c:/ap24/logs/ocsp(128000)"
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile "conf/xin.foo.com/xin.crt"
SSLCertificateChainFile "conf/xin.foo.com/bundle.crt"
SSLCertificateKeyFile "conf/xin.foo.com/xin.key"
# Uncomment the following directive when using client certificate authentication
#SSLCACertificateFile /path/to/ca_certs_for_client_authentication
# HSTS (mod_headers is required) (15768000 seconds = 6 months)
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /bar ajp://X.X.X.X:XXXX/bar/
ProxyPass /bar/ ajp://X.X.X.X:XXXX/bar/bar.html
</VirtualHost>
现在,正如您所看到的,根据 URL 的情况,我有 2 个代理密码。这是因为我有一个“管理”/后端区域和一个用户区域。第一个代理密码是针对管理区域的,第二个是针对用户区域的。
现在,对于这些网站,我需要这些 URL:
行政: https://xin.foo.com/bar/bar
用户: https://xin.foo.com/bar/bar?app=personal
我现在在“本地”环境中使用 Apache 服务器,这意味着我还没有一个带有 Apache 服务器公共 IP 的 TLD 子域。因此,在办公室的本地计算机上,我编辑了“windows/system32/drivers/etc”上的“hosts”文件,并添加了以下行:
xin.foo.com Y.Y.Y.Y (which is the IP address of the Apache frontal server).
这样,我就可以从我的机器上模拟来自 inet 的公共访问。
说了这么多,现在来说说事情:
Inet 人员将通过https://xin.foo.com。 就是这样。
我想 ”https://xin.foo.com“直接访问用户区。
还有类似的东西https://xin.foo.com/admin,访问ADMIN 后端区域。
那么,我猜有两件事需要考虑:
- AJP 代理通行证
- 是否可以先使用参数或其他东西进行 mod-rewrite,以强制已配置的代理密码工作?由于该应用程序安装在 Tomcat 服务器上,因此需要一些参数 (?app=personal) 来显示用户区域。并且没有参数 = 管理区域。
也许我必须删除 Proxypasses 并对其执行一些 mod_proxy_ajp?
正确的做法是什么?怎么做?我很感激最终的解决方案,因为 mod_rewrite 和 Porxypass 不是我的专长...而且我确信即使这两个代理密码也是错误的,但这就是他们给我的。
根据评论进行编辑:
总而言之,现在一切都运行正常,但我需要按照前面的说明编写 URL,以访问正确的区域。我想要的是根据逻辑更改服务器的行为,让简单的 TLD URL 转到用户区域,让“/admin”转到后端区域。我添加了从 http 到 https 的重写,效果很好。现在我想我可以添加一个重写,内容如下:
“如果https://xin.foo.com然后https://xin.foo.com/bar/bar?app=personal“
和
“如果https://xin.foo.com/admin然后https://xin.foo.com/bar/bar“
这样一来,我猜 AJP 程序应该还能正常工作。A+ 级的评分标准是不要修改浏览器上的 URL,这样人们才能继续阅读“https://xin.foo.com“寻找真实与隐藏”https://xin.foo.com/bar/bar?app=personal“。
非常感谢大家,并致以亲切的问候。