我更像是一名工程师,而不是一名 DevOps 人员,所以如果这太基础了,请原谅我。
我的情况:我在 example.edu 网络上有一台服务器,因此我无法控制到 example.edu 的主 DNS 接口。因此,我认为我可以使用 DNSSimple 或 Zerigo。但是,我在服务器上有 root 权限,并且它有以下两个主机名:
foo.example.edu
bar.example.edu
我的目标是设置 Apache 来执行以下操作。
首先,当访问者输入 foo.example.edu 时,他们应该会看到一个静态网页:
http://foo.example.edu
-> 提供静态网页然后,如果访问者输入 bar.example.edu,则应该执行 URL 重写,并且他们应该查看 Heroku 上托管的站点的 HTTPS 版本,如下所示:
http://bar.example.edu
->https://bar-example-edu.herokuapp.com
https://bar.example.edu
->https://bar-example-edu.herokuapp.com
https://bar.example.edu/some/url
->https://bar-example-edu.herokuapp.com/some/url
具体来说,这应该是一个 URL 重写,因此访问者在浏览器的地址栏中会看到
https://bar.example.edu/some/url
而不是https://bar-example-edu.herokuapp.com/some/url
。
我该怎么做?我想我应该使用 Apache mod_rewrite,并编辑 httpd.conf。我刚刚开始查看教程,但主要的棘手部分是我无法完全控制域,并且想确保我设置正确。
答案1
假设您已经拥有所有必要的 Apache VirtualHost 指令,那么您基本上需要将以下内容添加到“bar.example.com”的端口 80 和端口 443 VirtualHost 指令中...(选择其中一个)
选项 1:重写规则 由于您表示正在寻找重写规则,我会发布此规则,但正如下面的参考链接所述,这不是执行此操作的最佳方式。
RewriteEngine on
RewriteRule ^(.*)$ https://bar-example-edu.herokuapp.com/$1 [P]
参考:http://httpd.apache.org/docs/current/rewrite/flags.html#flag_p
选项 2:直接使用 mod_proxy
ProxyPass / https://bar-example-edu.herokuapp.com/
ProxyPassReverse / https://bar-example-edu.herokuapp.com/
参考:http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypass
... 顺便提一下,鉴于 heroku 应用程序正在使用 https(SSL),您可能应该将代理配置放在端口 443(ssl)VirtualHost 指令中,并在端口 80 VirtualHost 中包含以下行:
Redirect / https://bar.example.edu/
... 在访问者开始之前,它会引导他们到 https。
答案2
静态站点的 Apache 配置非常简单(我省略了标准的不相关的行)
<VirtualHost *:80>
ServerName foo.example.edu
DocumentRoot /var/www/foo.example.edu
</VirtualHost>
bar.example.edu 的重定向可以遵循Apache SSL 重定向指南。我将使用内置重定向,因为在这个简单的用例中不需要 mod_rewrite。
<VirtualHost *:80>
ServerName bar.example.edu
Redirect permanent / https://bar.example.edu/
</VirtualHost>
对于重定向到 Heroku,我将使用 mod_proxy_http 进行重定向。加密虚拟主机可以是类似
ProxyRequests Off
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from none
</Proxy>
ProxyVia On
<VirtualHost *:443>
ServerName bar.example.edu
SSLEngine On
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
ProxyPass / https://bar-example-edu.herokuapp.com/
ProxyPassReverse / https://bar-example-edu.herokuapp.com/
ProxyPassReverseCookieDomain / https://bar-example-edu.herokuapp.com/
</VirtualHost>
在您的应用程序源代码的 Heroku 端,您将创建一个具有以下内容的应用程序:
heroku create bar-example-edu
并配置他们的自定义域附加组件和
heroku domains:add bar.example.edu
略改编自我写的关于代理的文档的一部分到 Heroku。