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


74

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

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

这可能Redirect有用Rewrite吗?还是我不得不诉诸?

Answers:


108

尝试将其添加到您的vhost配置中:

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

*您可能需要添加mod_rewrite。对于基于ubuntu或基于debian的主机,以下方法将起作用:sudo a2enmod rewrite这将停止任何configtest / apache2配置错误。(如果您使用上面提供的虚拟主机添加,则会收到一个库存设置)
Joseph Orlando

这仅适用于主域(例如http://mywebiste.com-> https://mywebiste.com),如果我也进行了子域(http://blog.mywebiste.com-> https://blog.mywebiste.com)怎么办?
EsseTi '16

13
您可能必须在RewriteEngine On之后关闭RewriteCond%{HTTPS},否则可能会收到ERR_TOO_MANY_REDIRECTS
Max

小错字。缺少斜线,rewriteRule应该是https://%{HTTP_HOST}/$1 [R=301,L]
Dunatotatos

1
虚拟主机中的@ Dunatotatos,URI包含前导/,但在htaccess文件中,/前缀被删除。如果规则是在htaccess文件,我们就确实需要/的前$1
乔恩·林

83

两者都很好。但是根据Apache文档,您应该避免将其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/


40
如果不指定问题的ServerName部分,这将无法回答
Zam Sunk

这适用于我的设置。另外,请不要忘记结尾的斜杠,否则它将无法正确地与子文件夹一起重定向
vdidxho

谢谢,非常有帮助,更简单。
kiwicomb123

如果要将example.com重定向到example.com,请不要忘记将SSL配置放入VirtualHost:<VirtualHost *:443> ServerName example.com SSLCertificateFile ... SSLCertificateKeyFile ...上的SSLEngine重定向永久/示例。 com </ VirtualHost>,否则它将通过不正确的SSL证书通过默认的443虚拟主机进行重定向。也不要忘记尾部的斜线,否则它不会正确地与子文件夹重定向(如vdidxho所述。)
David Najman

37

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

这些规则旨在在.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]

==>在非https连接上匹配,或者(不设置[OR]会导致隐式AND!)

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

==>在没有https的情况下匹配转发的连接(代理,负载均衡器等)

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

==>如果两个条件中的一个都匹配,则重写整个URL,发送301,以使客户端对此消息进行“学习”(有些是,有些没有),最后一条规则则为L。


另一个问题是,您RewriteRule可能永远无法匹配。非常确定您要放下斜线:RewriteRule ^(.*) …
Mark Fox

可以肯定我不会。您错过了目标的/语法,包括'L'标志。另一种方法是像乔恩·林那样。
Jimmy Koerting

10
在这种情况下,RewriteCond是完全多余的。由于VirtualHost已被定义为<VirtualHost *:80>,所以从头开始%{SERVER_PORT}永远不会是443,因此条件将始终匹配。
Doktor J

1
*您可能需要添加mod_rewrite。对于基于ubuntu或基于debian的主机,以下方法将起作用:sudo a2enmod rewrite这将停止任何configtest / apache2配置错误。(只要您使用上面提供的虚拟主机添加功能,就会收到库存设置)
Joseph Orlando

0

我已经使用mkcert使用有效的HTTPS / SSL证书(Windows 10 XAMPP和Linux Debian 10 Apache2)创建无限* .dev.net子域和localhost。

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

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

在Windows 10中创建此文件(我将首先在Windows 10 XAMPP中安装它)

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将证书复制到/ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.