如何将两个带有/不带有 https 的域重定向到一个 https 站点?

如何将两个带有/不带有 https 的域重定向到一个 https 站点?

我想要执行以下操作:使用 Apache,重定向以下所有 URL:

http://example.com
http://www.example.com
http://beta.example.com
https://example.com
https://www.example.com
https://beta.example.com

到同一个地方:https://beta.example.com。我已经接近目标了,但还没有完全实现。以下是我得到的:

NameVirtualHost xxx.xxx.xxx.xxx:80
NameVirtualHost xxx.xxx.xxx.xxx:443

### rewrite scheme via http://stackoverflow.com/questions/1100343/apache-redirect-from-non-www-to-www                                    
<VirtualHost xxx.xxx.xxx.xxx:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/example
    CustomLog /var/log/httpd/example-log combined
    ErrorLog /var/log/httpd/example-log
</VirtualHost>

<Directory /var/www/html/example>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ https://beta.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    Options -Indexes
    Options +FollowSymLinks
    DirectoryIndex index.php
</Directory>

<VirtualHost xxx.xxx.xxx.xxx:80>
    ServerName beta.example.com
    DocumentRoot /var/www/html/example-beta
    CustomLog /var/log/httpd/example-beta-log combined
    ErrorLog /var/log/httpd/example-beta-log

    <IfModule mod_rewrite.c>
              RewriteEngine on
              # redirect all http -> https                                                                                             
              RewriteCond %{HTTPS} off
              RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    </IfModule>
</VirtualHost>

<VirtualHost xxx.xxx.xxx.xxx:443>
    ServerName beta.example.com
    DocumentRoot /var/www/html/example-beta
    ErrorLog /var/log/httpd/example-beta-log
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x" combined_ssl
    CustomLog /var/log/httpd/example-beta-log combined_ssl

    SSLEngine on
    ### SSL details omitted for clarity.
</VirtualHost>

我从中得到的是:

http://example.com => https://beta.example.com
http://www.example.com => Content for www.example.com (/var/www/html/example)
http://beta.example.com => https://beta.example.com
https://example.com => https://example.com (correct content but wrong url)
https://www.example.com => https://www.example.com (correct content but wrong url)
https://beta.example.com => https://beta.example.com

可能值得注意的是,我的 SSL 证书完全支持通配符,因此我应该没问题,而且所有的 SSL 东西似乎都正常工作(即使页面是在https://example.com)。同时,没有 .htaccess 文件——我正尝试通过 apache 配置完成所有操作。

因此问题在于https://example.com正确重定向,带或不带 www 前缀。有什么建议吗?谢谢!

答案1

据我所知,您需要两个单独的 VirtualHost 条目,一个用于 HTTP,一个用于 HTTPS。它们的区别在于端口(:80 表示 HTTP,:443 表示 HTTPS),而且因为 HTTPS 有 SSL On 部分。每个条目都需要列出所有名称:

ServerName  beta.example.com
ServerAlias example.com www.example.com

然后,您将获得相同的 DocumentRoot 和其中列出的其他信息。对于 HTTP VirtualHost,您已经知道需要重定向,因为您知道需要 HTTPS,因此您只需要 RewriteRule:

RewriteRule ^ https://beta.example.com%{REQUEST_URI} [R=301,L]

对于 HTTPS VirtualHost,您需要相同的 RewriteRule,但还需要添加一个条件:

RewriteCond %{HTTP_HOST} !^beta\.example\.com$
RewriteRule ^ https://beta.example.com%{REQUEST_URI} [R=301,L]

RewriteCond 的作用是防止无休止的重定向。

这样您就可以在一个地方控制重定向。如果您没有理由为每个域创建一个 VirtualHost,那么创建一个 VirtualHost 会更简单。

相关内容