我使用mod_rewrite遇到了麻烦并需要帮助。
我在DMZ中有一个反向代理,它接受来自外部客户端的请求子域sub1.example.com
和sub2.example.com
的请求,并将它们(透明地)转发到内部企业网络中的单个机器{{1 }}。具体做法是:
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
虽然我无法控制执行重定向的DMZ中的代理,但我确实可以完全控制承载Apache 2.2的https://internal.example.com
并使用internal.example.com
和80
进行侦听{1}}已加载。
我需要配置此Apache实例,以执行将上述四个子域地址(HTTP或HTTPS上的443
或mod_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]
相同的网络)进行测试时,重定向现在可以正常工作,但它们无法在任何网络上运行在它外面,其中:
任何人都可以建议我出错的地方,或者对我的环境更合适的配置吗?提前致谢!
答案 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 以及可能的其他配置更改,如文章中所述。
希望这有帮助!