【发布时间】:2011-08-13 21:49:12
【问题描述】:
我在使用 mod_rewrite 时遇到了问题,需要帮助。
我在 DMZ 中有一个反向代理,它接受来自外部客户端的请求,请求子域 sub1.example.com 和 sub2.example.com,并将它们(透明地)转发到内部公司网络中的单个机器 internal.example.com。具体来说:
-
http://sub1.example.com→http://internal.example.com -
https://sub1.example.com→https://internal.example.com -
http://sub2.example.com→http://internal.example.com -
https://sub2.example.com→https://internal.example.com
虽然我无法控制 DMZ 中执行重定向的代理,但我可以完全控制托管 Apache 2.2 并在加载了 mod_rewrite 的情况下侦听 80 和 443 的 internal.example.com。
我需要配置此 Apache 实例以将上述四个子域地址(HTTP 或 HTTPS 上的sub1 或 sub2)中的任何一个重定向到第四个地址 https://sub2.example.com (4)。为此,我目前在httpd.conf 中使用以下内容:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://sub2.example.com/$1 [R=301,L]
这适用于将请求地址 (1) 和 (3)(即任一子域的 HTTP 地址)的客户端重定向到正确的目标 (4),但对重写对地址 (2) 的访问没有影响。为了将 (2) 重定向到 (4),我将以下内容添加到配置 SSL 环境的 VirtualHost 元素中:
RewriteEngine On
RewriteCond %{SERVER_NAME} =sub1.example.com
RewriteRule ^/?(.*) https://sub2.example.com/$1 [R=301,L]
现在,如果客户端通过 HTTPS 请求 sub1.example.com(通过 mod_rewrite 日志记录确认),则会触发此事件。然而,虽然重定向现在在从 DMZ 机器(内部和与 internal.example.com 相同的网络上)进行测试时可以正常工作,但它们无法在外部的任何网络上工作。它,其中:
- 任一子域(1 和 3)的 HTTP 地址无法完全加载
- 任一子域(2 和 4)的 HTTPS 地址都会在客户端浏览器中产生错误,报告已执行过多重定向。
谁能建议我哪里出错了,或者更适合我的情况的配置?提前致谢!
【问题讨论】:
标签: apache mod-rewrite apache2 subdomain reverse-proxy