我以为我在将 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 登录页面外,不包含任何其他内容,这不是我的服务。
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)
归档时间: |
|
查看次数: |
2109 次 |
最近记录: |