在没有 ServerName 的默认虚拟主机上将 HTTP 重定向到 HTTPS

在我的 apache 服务器上,我希望能够将所有传入的 http 请求重定向到等效的 https 请求。问题是,我希望能够在不指定 ServerName的情况下为我的默认虚拟主机执行此操作,并使用请求 URL 中出现的任何服务器名称执行重定向工作。我希望是这样的:

NameVirtualHost *:80
<VirtualHost *:80>
RedirectPermanent / https://%{SERVER_NAME}/
...
</VirtualHost>

这是否可能使用 Redirect或我将不得不求助于 Rewrite

193245 次浏览

尝试在 vhost 配置中添加以下内容:

RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

这也是省略不需要的重定向的完整方法;)

这些规则用于。Htaccess 文件,因为 * : 80 VirtualHost 条目中的 RewriteRule 不需要条件。

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]

解说 :

RewriteEngine on

= = > 启动引擎

RewriteCond %{HTTPS} off [OR]

非超文本传输协议连接上 = = > match,或者(不设置[ OR ]将导致隐式 AND!)

RewriteCond %{HTTP:X-Forwarded-Proto} !https

= = > 匹配转发连接(代理、负载均衡器等) 没有 https

RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]

= = > 如果两个条件中的一个匹配,那么重写整个 URL,发送一个301让客户机“学习”(有些学习,有些不学习) ,最后一个规则发送 L。

两个都很好用。但是根据 阿帕奇文件,您应该避免使用 mod_rewrite进行简单的重定向,而是使用 Redirect。因此,根据他们的说法,你最好这样做:

<VirtualHost *:80>
ServerName www.example.com
Redirect / https://www.example.com/
</VirtualHost>


<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>

Redirect之后的第一个 /是 URL,第二部分是它应该被重定向的位置。

您还可以使用它将 URL 重定向到子域: Redirect /one/ http://one.example.com/

我已经使用 Mkcert创建了无限的 * . dev.net 子域和本地主机,并且有有效的 HTTPS/SSL 证书(Windows 10 XAMPP & Linux Debian 10 Apache2)

我使用 mkcert v1.4.0在 Windows 上创建 certs (以管理员身份执行 CMD) :

mkcert -install
mkcert localhost "*.dev.net"

这将在 Windows10中创建这个文件(我将首先在 Windows10XAMPP 中安装它)

localhost+1.pem
localhost+1-key.pem

覆盖 XAMPP 默认证书:

copy "localhost+1.pem" C:\xampp\apache\conf\ssl.crt\server.crt
copy "localhost+1-key.pem"  C:\xampp\apache\conf\ssl.key\server.key

现在,在 Apache2 for Debian 10中,激活 SSL & vhost _ alias

a2enmod vhosts_alias
a2enmod ssl
a2ensite default-ssl
systemctl restart apache2

对于 vhost _ alias,添加 Apache2配置:

nano /etc/apache2/sites-available/999-vhosts_alias.conf

内容如下:

<VirtualHost *:80>
UseCanonicalName Off
ServerAlias *.dev.net
VirtualDocumentRoot "/var/www/html/%0/"
</VirtualHost>

添加网站:

a2ensite 999-vhosts_alias

通过 SSH 将 certs 复制到/root/mkcert 并覆盖 Debian:

systemctl stop apache2


mv /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/ssl/certs/ssl-cert-snakeoil.pem.bak
mv /etc/ssl/private/ssl-cert-snakeoil.key /etc/ssl/private/ssl-cert-snakeoil.key.bak


cp "localhost+1.pem" /etc/ssl/certs/ssl-cert-snakeoil.pem
cp "localhost+1-key.pem" /etc/ssl/private/ssl-cert-snakeoil.key


chown root:ssl-cert /etc/ssl/private/ssl-cert-snakeoil.key
chmod 640 /etc/ssl/private/ssl-cert-snakeoil.key


systemctl start apache2

编辑 SSL 配置

nano /etc/apache2/sites-enabled/default-ssl.conf

在开始编辑包含以下内容的文件:

<IfModule mod_ssl.c>
<VirtualHost *:443>


UseCanonicalName Off
ServerAlias *.dev.net
ServerAdmin webmaster@localhost


# DocumentRoot /var/www/html/
VirtualDocumentRoot /var/www/html/%0/

...

最后重启:

systemctl restart apache2

注意: 不要忘记在/var/www/html/中为子域创建文件夹

/var/www/html/subdomain1.dev.net
/var/www/html/subdomain2.dev.net
/var/www/html/subdomain3.dev.net