Apache 允许 HTTP 访问,但应重定向到 HTTPS

Apache 允许 HTTP 访问,但应重定向到 HTTPS

我以为我已经遵循了将 HTTP 流量重定向到 HTTPS 的既定观点,但是今天出现 DNS 问题后,我不得不使用 IP 地址而不是 URL,这时我意识到有些不对劲。

Apache.conf:

<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> 

鉴于上述情况,我对以下几点感到困惑:

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 登录页面外不包含任何其他内容,而这不是我所提供的服务。

答案1

引自文档

如果在包含最具体匹配的 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则第一个列出的虚拟主机与之匹配的将被使用。

(不是我强调的)。

换句话说,即使配置的 VirtualHosts 都不完全匹配,Apache 也会始终使用其中一个 VirtualHosts。不配置地址并不意味着该地址不提供某些内容的服务器。

(注:发完这篇帖子后我才意识到这个问题的标签是 apache-2.2,但 2.2 文档包含一个几乎相同的段落)。

答案2

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

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

你可能有一个Listen 80在您的 httpd.conf 中的其他地方添加指令,允许 Apache 在所有接口上接受到端口 80 的流量。(您可能希望保留该指令,以便能够继续在面向互联网的网站上从 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> 

答案3

Apache 将会从头到尾进行查看。

第一种情况:如果您通过 http 的 ip 调用服务器,例如:http://server_ip。这将匹配第一个虚拟主机并为您的 /var/www/web 文件夹文件提供服务。

第二种情况:如果你使用 http 域名调用服务器,例如:http://example.com. 这将匹配第二个虚拟主机并强制重定向到https://example.com

第三种情况:如果您通过 https 域名调用服务器,例如:https://example.com. 这将匹配第三个虚拟主机。

#1st Case 
    <VirtualHost *:80>
       ServerName server_ip
       DocumentRoot /var/www/web
    </VirtualHost>

#2nd Case
    <VirtualHost *:80>
       ServerName example.com
       Redirect permanent "/" "https://example.com/"
    </VirtualHost>

#3rd Case  
    <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>

相关内容