![将端口 80 全局重定向至 443](https://linux22.com/image/620639/%E5%B0%86%E7%AB%AF%E5%8F%A3%2080%20%E5%85%A8%E5%B1%80%E9%87%8D%E5%AE%9A%E5%90%91%E8%87%B3%20443.png)
我想设置我的 Linux 机器,这样任何到达端口 80 的东西都会被告知要请求 443。我希望它不受域、IP 或任何可能存在的具体细节的影响。如果可以请求端口 80,它应该被告知不行。我们在 443 上这样做。
我将在 443 上使用 Apache,因此可以很容易地将其绑定到 80,但不认为解决方案必须在端口 80 上包含 Apache。
需要明确的是,我正在寻找一种不需要更改虚拟主机的解决方案。我了解可以通过继承传递的全局重定向。这需要更改虚拟主机。我正在寻找一种更全面且更不容易出现“哎呀,我忘了那行,现在端口 80 正在暴露我的未加密数据”的东西。
您将如何解决这个问题?iptables、apache、使用 netcat 的自定义 shell 脚本以及一些让它转为 SSL 的魔法?
答案1
尝试将其添加到您的httpd.conf;
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
从这里 ->http://www.sslshopper.com/apache-redirect-http-to-https.html
这使用 mod_rewrite,因此请确保您事先安装了它。
建议的方法是按照您的说法在每个站点的 VHOST 文件中进行设置,如下所述;
http://wiki.apache.org/httpd/RedirectSSL
但是,Apache wiki 确实更详细地记录了上述重写方法;
答案2
使用 iptables 将端口 80 重定向到 443 很简单,但是从您的描述来看,您显然不想在端口 443 上运行 http:您希望将人们从 http 重定向到 https。
您清楚地知道可以在 Apache 中为每个虚拟主机完成此操作,但您不想使用它来避免配置错误;否则我会推荐 sgtbeano 的解决方案。
基于此,我建议您停止在端口 80 上使用 Apache,并在端口 80 上运行另一个执行简单重定向的 Web 服务器。
您甚至可以在端口 80 上运行具有不同配置目录的单独 Apache 实例。这也可以避免配置错误,但可能更难维护(没有多少人希望在同一台主机上运行 2 个不同的 Apache 实例,并设置 2 组不同的配置文件)。在这种情况下,您可以将 sgtbeano 的配置用于端口 80 实例。
答案3
由于 HTTP 和 HTTPS 是两种不同的协议,您不能简单地将 iptables tcp/80 重定向到 tcp/443,因为 apache 无法理解 tcp/443 上的 HTTP
因此 HTTP 请求必须到达 apache/nginx/etc,然后在应用层进行“重定向”。这将在 nginx 上使用“重定向 /https://域名/“或者在 Apache 上使用重写规则