我正在寻找正确的方法来处理使用 Apache 服务器配置将不安全(通过端口 80)请求重定向到安全(端口 443)请求。我也不想将其放在我的 .htaccess 文件中。
目前我有这个httpd配置文件文件:
ServerName example.com
ServerAlias *.example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.+)\.example\.com$
RewriteRule ^(.*)$ https://%1.example.com/$1 [R=302,L]
目标是进行通配符(在子域和子文件夹中)重定向。具体来说,以下是一些主要用例:
- http://subdomain.example.com 到 https://subdomain.example.com - http://example.com 到 https://www.example.com - http://www.example.com/contact/ 到 https://www.example.com/contact - http://subdomain.example.com/contact/ 到 https://subdomain.example.com/contact
简而言之,只需更换http和https只要满足两个条件:
请求的 URI 包含 mydomain.com
请求的 URI 尚不安全(仅限 http 流量)
我尝试过许多不同的方法,但令我惊讶的是,似乎没有一种方法可以捕获子域名和子文件夹的所有变化。
有什么想法吗?谢谢!
答案1
简单的虚拟主机是捕获所有 HTTP 请求的最佳方式。这样您就不会意外重定向 HTTPS 请求。类似这样。
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
# Redirect subdomains.
RewriteEngine on
RewriteCond %{HTTP_HOST} (\w+.example.com)
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
# Everything else to www.example.com preserving URI path
Redirect 301 / https://www.example.com/
</VirtualHost
答案2
要重定向到 HTTPS:
重写引擎开启
RewriteCond %{HTTPS} 关闭
重写规则 ^ https://%{HTTP_HOST}%{REQUEST_URI}
但是你需要有一个用于 SSL 的虚拟主机:
名称虚拟主机 *:443
< 虚拟主机 *:443>
ServerName example.com
ServerAlias www.example.com
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
</虚拟主机>
使用的 mod 重写指令的解释
RewriteEngine On --- 它将打开 apache 服务器的 mod_rewrite 引擎
RewriteCond %{HTTPS} 关闭 ------
如果连接使用 SSL/TLS,则包含文本“on”,否则包含文本“off”。(无论是否加载 mod_ssl,都可以安全使用此变量)。如果连接不是 ssl/tls,则将评估为真条件
重写规则 ^ https://%{HTTP_HOST}%{REQUEST_URI}
这是为了形成客户端最初请求的 url,但是是 https