80

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

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

这可能使用Redirect还是我必须求助于Rewrite

4

4 回答 4

115

尝试将其添加到您的虚拟主机配置中:

RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
于 2012-07-23T21:59:09.703 回答
87

两者都工作正常。但是根据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/

于 2015-01-16T03:30:04.797 回答
38

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

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

于 2013-07-28T14:11:49.297 回答
0

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

我使用 mkcert v1.4.0 在 Windows 上创建证书(以管理员身份执行 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
于 2019-10-26T17:07:37.520 回答