Apache 允许 HTTP 访问何时应该重定向到 HTTPS

who*_*ked 6 ssl apache-2.2

我以为我在将 HTTP 流量重定向到 HTTPS 时遵循了公认的智慧,但是在今天出现 DNS 问题之后,不得不使用 IP 地址而不是 URL,我意识到有些不对劲。

配置文件:

<VirtualHost *:80>
   ServerName 127.0.0.1

   DocumentRoot /var/www/web
</VirtualHost>

<VirtualHost _default_:443>
   ServerName example.com

   DocumentRoot /var/www/web
   SSLEngine On
   SSLCertificateFile      /etc/ssl/local_certs/example.com.pem
   SSLCertificateKeyFile /etc/ssl/local_certs/example.com.pem.key
   Header set Access-Control-Allow-Origin "*"
</VirtualHost>

<VirtualHost *:80>
   ServerName example.com

   Redirect permanent "/" "https://example.com/"
</VirtualHost> 
Run Code Online (Sandbox Code Playgroud)

鉴于上述,我对几点感到困惑:

1) 如果我们现在使用 IP 地址,为什么上述 ServerName 特定虚拟主机中的任何一个都为页面提供服务?如果我当前使用的 IP 地址对应于域名(应该,但今天没有,DNS 问题),这会减少我的困惑。

2) 鉴于我使用的 IP 地址不是 127.0.0.1,为什么我允许访问端口 80?

解释一下 127.0.0.1 主机,这是一个本地 apt 存储库的方便。我知道 ServerName 不是 100% 安全的,但这不是一个紧迫的问题。

当我通过 IP 浏览网站时会发生什么:

首先,我被重定向到同一 IP 地址上的 HTTPS,这正是我所期望的。但是,如果我返回浏览器中的地址栏并从 https 中删除“s”,它会在没有重定向的情况下将我导航到端口 80 上的页面,并且我可以继续浏览不安全的站点。

我应该补充一点,开箱即用的启用/可用站点配置文件仍然存在,但它们的文档根目录为 /var/www/html,除了默认的 apache index.html 登录页面外,不包含任何其他内容,这不是我的服务。

Ger*_*der 8

文档中引用:

如果在包含最特定匹配 IP 地址和端口组合的虚拟主机集中找不到匹配的 ServerName 或 ServerAlias,则将使用第一个列出的匹配虚拟主机

(突出显示不是我)。

换句话说,Apache 将始终使用 VirtualHosts 之一,即使没有一个配置的 VirtualHosts 完全匹配。不配置地址并不意味着该地址不是服务器的某些内容。

(注意:只有在发布此内容后,我才意识到问题被标记为 apache-2.2,但 2.2 文档包含几乎相同的段落)。

  • 你不需要谷歌,你需要文档,除非你不需要,因为相关部分已经在这个答案中引用了,所以你只需要阅读答案。:) (2认同)

HBr*_*ijn 6

2) 鉴于我使用的 IP 地址不是 127.0.0.1,为什么我允许访问端口 80?

因为您没有专门将 Apache httpd 绑定/限制到环回接口,并监听所有接口。

您可能Listen 80在 httpd.conf 的其他地方有一个指令,允许 Apache 在所有接口上接受到端口 80 的流量。(您可能希望保留它以便能够在面向 Internet 的网站上继续从 HTTP 重定向到 HTTPS)。

此外,您<VirtualHost *:80>在虚拟主机定义中使用。这使得它们在所有接口/IP 地址上都有效。正如 Gerald Scneider 已经解释的那样,然后将第一个 VirtualHost 条目设为默认值,它将处理与您的任何其他 VirtualHost 条目不匹配的所有请求。

您的用例是关于何时使用更具体的基于 IP 的 VirtualHost 定义的一个很好的例子,这些定义将更可预测地按照您的意图行事:

<VirtualHost 127.0.0.1:80>
   ServerName 127.0.0.1
   DocumentRoot /var/www/web
</VirtualHost>


<VirtualHost example.com:80>
   ServerName example.com
   Redirect permanent "/" "https://example.com/"
</VirtualHost> 
Run Code Online (Sandbox Code Playgroud)