如何为 Heroku 实例设置 URL 重写?

如何为 Heroku 实例设置 URL 重写?

我更像是一名工程师,而不是一名 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。

相关内容