【问题标题】:Using Apache 2.2 mod_rewrite to consolidate subdomains使用 Apache 2.2 mod_rewrite 合并子域
【发布时间】:2011-08-13 21:49:12
【问题描述】:

我在使用 mod_rewrite 时遇到了问题,需要帮助。

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

  1. http://sub1.example.com   → http://internal.example.com
  2. https://sub1.example.comhttps://internal.example.com
  3. http://sub2.example.com   → http://internal.example.com
  4. https://sub2.example.comhttps://internal.example.com

虽然我无法控制 DMZ 中执行重定向的代理,但我可以完全控制托管 Apache 2.2 并在加载了 mod_rewrite 的情况下侦听 80443internal.example.com

我需要配置此 Apache 实例以将上述四个子域地址(HTTP 或 HTTPS 上的sub1sub2)中的任何一个重定向到第四个地址 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


    【解决方案1】:

    问题是重定向触发了来自客户端浏览器的新请求。所以他要求sub2.example.com,DMZ反向代理不明白。

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

    由于反向代理是你的前端接口,你需要他理解sub2.xxx,否则它不起作用。

    【讨论】:

    • 我不确定我是否关注你——正如我在文章开头所描述的那样,DMZ 中的反向代理配置为识别和转发来自请求子域 @987654324 的客户端的请求@ 到内部机器 (internal.example.com)。我怀疑问题出在重写规则本身,它们在某种程度上导致了重定向循环,但我不确定。
    【解决方案2】:

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

    尝试以下方法: -在httpd.conf@end 验证是否出现以下行:

    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)的工作方式不同。 我不知道,因为我还没有对虚拟主机和 SSL 做太多事情。 为了使用此方法正确设置 SSL,请阅读以下内容:http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#vhosts2总结,有时执行上述操作,[即所有操作都相同,但使用端口 443 而不是 80],会起作用,但根据某些因素,您可能也只想做一个 命名虚拟主机 192.168.1.1:443 以及文章中描述的可能的其他配置更改)。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2011-05-30
      • 2010-10-26
      • 2012-05-09
      • 2013-02-04
      相关资源
      最近更新 更多