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

时间:2012-07-23 21:47:53

标签: apache http redirect https

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

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

这可以使用Redirect,还是必须诉诸Rewrite

4 个答案:

答案 0 :(得分:96)

尝试在vhost配置中添加:

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

答案 1 :(得分:81)

两者都很好。但根据Apache docs,您应该避免使用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重定向到子域: Redirect /one/ http://one.example.com/

答案 2 :(得分:34)

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

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

<强> Eplanations

RewriteEngine on

==&GT;完全启用引擎

RewriteCond %{HTTPS} off [OR]

==&GT;匹配非https 连接,或(不设置[OR]会导致隐式AND!)

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

==&GT;匹配转发的连接(代理,负载均衡器等)不带 https

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

==&GT;如果两个条件中的一个匹配,则重写整个URL,发送301以使客户端“学习”(有些人做,有些人没有)和L用于最后一个规则。

答案 3 :(得分: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