为了将我的域名切换到HTTPS,我是否需要更改Apache或我的Node.js应用程序?

Mih*_*sek -1 apache ssl reverse-proxy node.js

我有一个在我的域上运行的Web应用程序.首先我有常规HTTP站点,它在我的服务器上的端口8082上运行,而Apache服务器(使用虚拟主机)将请求从端口80重定向到localhost:8082.

现在我获得了一个SSL证书,我试图在我的网站上安装.我在Node中创建了一个HTTPS服务器,并且https://localhost:8082一切正常.

但后来我尝试通过HTTPS提供我的域名.我尝试编辑我的虚拟主机文件以使用证书,但我认为我没有正确编写它.此外,我试图让它将HTTP重定向到HTTPS,但它没有用.

我该怎么办?我应该在Node中运行HTTP或HTTPS服务器,我应该在Apache虚拟主机配置中添加什么?

这是我的虚拟主机文件:

<VirtualHost *:80>
        ServerName www.domain.com
        Redirect permanent / https://www.domain.com
</VirtualHost>

<VirtualHost *:443>

        ServerName domain.com
        ServerAlias www.domain.com

        SSLEngine On
        SSLProxyEngine On
        SSLCertificateFile "/home/USERNAME/Projects/NODEAPP/chained.pem"
        SSLCertificateKeyFile "/home/USERNAME/Projects/NODEAPP/domain.key"

        ProxyPreserveHost On
        ProxyRequests off

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        <Location />
                ProxyPass http://localhost:8082/

                ProxyPassReverse http://localhost:8082/
        </Location>

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

str*_*gee 7

(公平警告:我对你的问题的理解是你想要https://www.domain.com出现在浏览器的URL栏中,而不是https://www.domain.com:8082.如果不是这种情况,下面的很多内容都是错误的,但可能仍然可以帮助你更好地理解你的问题.)

背景

(又称,HTTP设计速成课程,因为我觉得你不太了解发生了什么,但如果你这样做,可以随意跳过:)

我认为你对Apache的做法存在误解 - 主要是因为你说它是"重定向"请求.

HTTP重定向是状态代码在3xx范围内的任何(?)响应,它会告诉您的浏览器它所请求的资源已移动到其他位置.例如,假设http://example.com/foo以前存在,但后来被移到http://example.org/bar(注意.com.org差异).如果您在http://example.com/fooURL栏中输入,您的浏览器将请求/foo(特别是它将发送HTTP GET请求)example.com.example.com然后将HTTP响应发送回浏览器重定向http://example.org/bar.那么浏览器就会发送一个HTTP GET请求/barexample.org并取回包含资源的响应.

这是一个图表:

Step 1:

-------------                                   --------------------------
|           |                                   |                        |
|  Browser  | -------- HTTP GET /foo ---------> | example.com web server |
|           | <-- HTTP 301 Moved Permanently -- |                        |
-------------                                   --------------------------

Step 2:

-------------                        --------------------------
|           |                        |                        |
|  Browser  | --- HTTP GET /bar ---> | example.org web server |
|           | <---- HTTP 200 OK ---- |                        |
-------------                        --------------------------
Run Code Online (Sandbox Code Playgroud)

现在,这就是事情.这不是你正在做的事情,也不是你想要做的事情.你正在做的事情被称为反向代理,这是每当Web服务器(在你的情况下是Apache)收到请求时,它只是将它转发到其他地方.在您的原始(全HTTP)设置中,Web浏览器www.domain.com将从Apache 请求,然后Apache将简单地转发该请求,几乎没有修改http://localhost:8082.这是图表:

Step 1:

-------------                        ----------                        ------------------
|           |                        |        |                        |                |
|           | ----- HTTP GET / ----> |        |                        |                |
|  Browser  |                        | Apache | ----- HTTP GET / ----> | localhost:8082 |
|           |                        |        | <---- HTTP 200 OK ---- |                |
|           | <---- HTTP 200 OK ---- |        |                        |                |
-------------                        ----------                        ------------------

Step 2:

There is no step 2. BOOM.
Run Code Online (Sandbox Code Playgroud)

这里要注意的重要一点是浏览器没有"看到"Node.js,它在另一端看到了Apache.同样,Node.js没有"看到"浏览器,它看到了Apache(尽管Apache通常会使用有关浏览器连接的详细信息来扩充请求 - 请参阅例如X-Forwarded-For标题).

这是HTTP设计的一个有意的部分 - HTTP请求和响应语义并不暗示有关如何处理请求的内部实现细节.这就是HTTP如此强大的原因.它可以让你创建非常复杂的设置 - 想想你正在做的事情,但规模要大得多,甚至更多的组件 - 然后通过向外部世界展示的简单,统一的界面抽象出复杂性:你的URL层次结构与HTTP请求/响应周期.

如何解决您的实际问题

现在我们已经确定你要做的事情,这就是你的问题所在:你正在混淆Node.js所说的协议与Apache所说的协议(以及外部世界所看到的).

您的最终目标是让人们通过HTTPS连接到您的网站,对吗?在这种情况下,您不需要Node.js来说HTTPS,因为与Node.js直接对话的唯一事情就是Apache.Apache是​​与浏览器对话的东西,因此Apache是​​您使用HTTPS所需要的.理想情况下,你有Apache说浏览器的HTTPS和HTTP到Node.js - 如果Apache加密到Node的流量并不重要,因为Node在localhost上.以图表形式:

-------------                         ----------                        ------------------
|           |                         |        |                        |                |
|           | ----- HTTPS GET / ----> |        |                        |                |
|  Browser  |                         | Apache | ----- HTTP GET / ----> | localhost:8082 |
|           |                         |        | <---- HTTP 200 OK ---- |                |
|           | <---- HTTPS 200 OK ---- |        |                        |                |
-------------                         ----------                        ------------------
Run Code Online (Sandbox Code Playgroud)

因此,让您的Node应用程序侦听HTTP请求,然后修复Apache配置以使用HTTPS提供服务,但是向Node后端说HTTP.

我认为你的配置有什么问题,你需要在路径周围引用,即<Location "/">.或者在我所拥有的反向代理配置中,我有ProxyPass没有<Location>块的指令设置,如下所示:

ProxyPass / http://localhost:8082/
ProxyPassReverse / http://localhost:8082/
Run Code Online (Sandbox Code Playgroud)

所以你也可以尝试一下.

如果它仍然不起作用,请尝试删除<Proxy>/ </Proxy>block - 我不确定它是做什么的,但我在反向代理配置中没有这样的东西(哪个有效) - 所以它可能会干扰某些东西.

至于你的HTTP到HTTPS重定向,我真的没有看到任何错误.你确定要连接www.domain.com而不是domain.com吗?第二个VirtualHost服务于两者,但第一个仅服务于前者.