我以为我已经遵循了将 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
答案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>