将所有请求重定向到HTTPS并将www重定向到非www

问题描述:

我正在修复服务器上的我的Apache(2.4.12)配置文件,该服务器提供三个不同的域名。我为每个站点有不同的配置文件。我不能为我的生活弄清楚如何完成以下两项:将所有请求重定向到HTTPS并将www重定向到非www

  1. 重定向所有http请求https,保持请求(子域/主机和文件路径)的所有其余完全一样
  2. 重定向所有www请求非www

我读过,这可以在一个步骤中完成,如果我只有一个*:80虚拟主机,把重写规则出现(在我的子域的其余部分都*:443 VirtualHosts除了www),但我不知道如何去做。在SO这些答案没有工作:

  • this question接受的答案是不正确的(仅做了https重定向)
  • This answer不为我工作 - 只有https重定向作品。
  • This question不处理通配符子域,因此不适用。
  • This question也不适用,因为它不处理子域。

编辑:这是我在下面mike.k's answer的评论引用代码。

<VirtualHost *:80> 
    RewriteEngine On 
    RewriteCond %{HTTP_HOST} www.example.com 
    RewriteRule ^(.*)$ https://example.com/$1 [R=permanent,L] 

    RewriteCond %{HTTPS} off 
    RewriteRule (.*) https://example.com%{REQUEST_URI} 
</VirtualHost> 

这是从我的生产系统和工作。

THE_HOSTNAME是例如server,然后THE_FQHNserver.domain.edu,这有助于为SSL证书,如果你不希望支持通配符和多个域名。

# redirect to FQHN 
RewriteEngine on 
RewriteCond %{HTTP_HOST} THE_HOSTNAME$ 
RewriteRule ^(.*)$ https://THE_FQHN/ $1 [R=permanent,L] 

# redirect to HTTPS 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://THE_FQHN%{REQUEST_URI} 

在你的情况www.domain.com将其中THE_HOSTNAME是,和THE_FQHNdomain.com,只是围绕

+0

看来,'在你的代码的4行$ 1'不应之前有一个空间翻转(我收到一个语法错误)。我现在正在测试,我会告诉你,如果它在删除该空间时起作用。 – vaindil

+0

不幸的是,它不起作用。我用你的代码完全按照你的代码(根据我以前的评论固定的“$ 1”),但是使用我的主机名信息。 'https'重定向工作正常,但'www'未被删除。我将确切的设置添加到OP中,以便您可以看到它。 – vaindil

+0

你对这个空间是正确的,我在粗心大意的打字中引入了它。把'$'放在你的Edit中'www.example.com'的末尾,所以'RewriteCond%{HTTP_HOST} www.example.com $' –