我想要执行以下操作:使用 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 会更简单。