我正在配置 Apache 2.2 前端,以通过 mod_proxy_ajp 将特定应用程序传递到 Tomcat。其中一些应用程序(如登录/身份验证服务)我希望强制仅接受 HTTPS 访问。
我的 httpd-proxyajp.conf 文件中针对每个应用程序包含如下节:
ProxyPass /auth-1.0 ajp://localhost:8009/auth-1.0
ProxyPassReverse /auth-1.0 ajp://localhost:8009/auth-1.0
<Proxy /auth-1.0>
Order Deny,Allow
Allow from All
</Proxy>
<Proxy /auth-1.0/WEB-INF>
Order Deny,Allow
Deny from All
</Proxy>
我不想将 http 请求重定向给他们——如果有人编写一个客户端,盲目地将他们的登录凭据以明文形式传递给我,而我只是让他们通过重定向再次加密传递,那么这有点违背了目的。所以我不想使用常见的解决方案,
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^/auth-1.0 https://%{HTTP_HOST}%{REQUEST_URI}
我实际上想抛出一个错误。
并发症:在 Amazon EC2 上执行此操作,因此无法使用基于 IP 的虚拟主机,也无法使用基于名称的虚拟主机,因为我使用的是 SSL。无论如何,我更愿意在没有虚拟主机的情况下执行此操作;我需要使用相同的 DNS 名称来提供应用程序。
答案1
我想我想到了一个可以满足我要求的方法,但我想听听大家的意见。我已经测试过了,它似乎适用于大多数明显的用例,但对于一些特殊情况,可能会比较棘手。无论如何,对于任何我希望“仅使用 https”的应用程序,如果您通过 http 访问它们,它会抛出 403 Forbidden,但通过 https 可以正常工作。
在 httpd-proxyajp.conf 中:
RewriteEngine On
#
# Auth Service
#
RewriteCond %{HTTPS} off
RewriteRule ^/auth-1.0 - [F]
ProxyPass /auth-1.0 ajp://localhost:8009/auth-1.0
...
#
# An Insecure Service, foo
#
ProxyPass /foo-1.0 ajp://localhost:8009/foo-1.0
...
#
# Another Secure-only Service, bar
#
RewriteCond %{HTTPS} off
RewriteRule ^/bar-1.0 - [F]
ProxyPass /bar-1.0 ajp://localhost:8009/bar-1.0
...