使用Apache 2.2 mod_rewrite来合并子域

时间:2011-04-27 14:07:50

标签: apache mod-rewrite apache2 subdomain reverse-proxy

我使用mod_rewrite遇到了麻烦并需要帮助。

我在DMZ中有一个反向代理,它接受来自外部客户端的请求子域sub1.example.comsub2.example.com的请求,并将它们(透明地)转发到内部企业网络中的单个机器{{1 }}。具体做法是:

  1. internal.example.comhttp://sub1.example.com
  2. http://internal.example.comhttps://sub1.example.com
  3. https://internal.example.comhttp://sub2.example.com
  4. http://internal.example.comhttps://sub2.example.com
  5. 虽然我无法控制执行重定向的DMZ中的代理,但我确实可以完全控制承载Apache 2.2的https://internal.example.com并使用internal.example.com80进行侦听{1}}已加载。

    我需要配置此Apache实例,以执行将上述四个子域地址(HTTP或HTTPS上的443mod_rewrite)中的任何一个重定向到第四个地址sub1( 4)。为此,我目前在sub2中使用以下内容:

    https://sub2.example.com

    这适用于将请求地址(1)和(3)的客户端(即,任一子域的HTTP地址)重定向到正确的目标(4),但对重写对地址(2)的访问没有影响。要将(2)重定向到(4),我已将以下内容添加到配置SSL环境的httpd.conf元素中:

    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://sub2.example.com/$1 [R=301,L]
    

    如果客户端通过HTTPS请求VirtualHost(通过mod_rewrite日志记录确认),则会触发此操作。但是,虽然从机器 后面 DMZ(内部和与RewriteEngine On RewriteCond %{SERVER_NAME} =sub1.example.com RewriteRule ^/?(.*) https://sub2.example.com/$1 [R=301,L] 相同的网络)进行测试时,重定向现在可以正常工作,但它们无法在任何网络上运行在它外面,其中:

    • 子域(1和3)的HTTP地址无法完全加载
    • 子域(2和4)的HTTPS地址在客户端浏览器中产生错误,报告已执行了太多重定向。

    任何人都可以建议我出错的地方,或者对我的环境更合适的配置吗?提前致谢!

2 个答案:

答案 0 :(得分:0)

问题是重定向会从客户端浏览器触发新请求。所以他要求sub2.example.com并且DMZ反向代理不理解。

也许它可以在没有[R=...]的情况下工作,但我甚至不确定,因为它仍然可以触发请求。当然,它不再是重定向。

由于反向代理是您的前端界面,因此您需要他了解sub2.xxx,否则它将无效。

答案 1 :(得分:0)

虽然我没有完全像你那样使用我的解决方案,但我怀疑有一个更简单的问题。比使用重写更清洁的方式。 (注意:下面假设内部DNS将您的一台服务器识别为要解析所有子域的IP。如果不是这种情况,则可能会发生此更改...我不知道如果它会发生什么没有,但我也没有设置反向代理...)

请尝试以下操作: - 在httpd.conf @结束时验证是否出现以下行:

NameVirtualHost *:80

- 最后为每个*子域添加一个VirtualHost,如下所示:

<VirtualHost *:80>
ServerName sub1.example.com
ServerAlias sub1
DocumentRoot "X:/path/to/website/for/internal.example.com"
</VirtualHost>

*重要说明:您可能只能使用一个虚拟主机条目。 为此,请尝试以下方法:

<VirtualHost *:80>
ServerName internal.example.com
ServerAlias sub1.example.com
ServerAlias sub2.example.com
ServerAlias sub3.example.com
DocumentRoot "X:/path/to/website/for/internal.example.com"
</VirtualHost>

非常重要注意事项: 这可能与SSL(端口443)完全不同。 我不知道,因为我还没有做过很多虚拟主机&amp; SSL。 要使用此方法正确设置SSL,请阅读以下内容:http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#vhosts2摘要,有时做上面的事情,[这样做的一切都是相同的,但端口443而不是80],会起作用,但是,根据某些因素,你可能只想做一个     NamedVirtualHost 192.168.1.1:443 以及可能的其他配置更改,如文章中所述。

希望这有帮助!