如何使用/不使用https将两个域redirect到一个https站点?

我想要做以下事情:使用Apache,redirect所有以下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文件 – 我正在尝试通过Apacheconfiguration来做所有事情。

所以问题是让https://example.com正确redirect,有和没有www前缀。 有任何意见呢? 谢谢!

从我正在阅读的内容中,您需要两个单独的VirtualHost条目,一个用于HTTP,一个用于HTTPS。 这些端口是不同的(HTTP为80,HTTPS为443),而且HTTPS的SSL On部分也是如此。 每个人都需要列出所有的名字:

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

然后,你将有所有相同的DocumentRoot和其他信息列在那里。 对于HTTP VirtualHost,你已经知道你需要redirect,因为你知道你需要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可以防止无休止的redirect。

这将允许您在一个地方控制redirect。 如果您没有理由为每个域创build一个VirtualHost,那么只需要一个虚拟主机就可以了。