我目前正在尝试让人们去http://a.abc.com(在获取一些 X-HTTP-Headers 并将其保存在会话中后,我将它们发送到 https 站点)我总是希望它们转到 a.abc.com 站点,如果 http_host 不是 a.abc.com,我希望它们将它们重定向到那里:)
我希望你们能帮忙吗?
<VirtualHost *:80>
ServerName a.abc.com
ServerAlias b.abc.com bcd.com efg.com
DocumentRoot /var/www/wclp/public
SetEnv APPLICATION_ENV production
RewriteEngine On
RewriteCond %{HTTP_HOST} !a.abc.com$
RewriteRule ^(.*)$ http://a.abc.com/$1 [R=301, L]
</VirtualHost>
<VirtualHost *:443>
ServerName a.abc.com
ServerAlias b.abc.com bcd.com efg.com
DocumentRoot /var/www/wclp/public
SetEnv APPLICATION_ENV production
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/crt.pem
SSLCertificateKeyFile /etc/apache2/ssl/key.pem
RewriteEngine On
RewriteCond %{HTTP_HOST} !a.abc.com$
RewriteRule ^(.*)$ http://a.abc.com/$1 [R=301, L]
</VirtualHost>
答案1
乍一看,这似乎可行,但仔细检查后,我发现了一些错误。
在您的端口 80 虚拟主机中,您有!a.abc.com$。此语句将匹配 b.abc.com 的 true,但将返回 ba.abc.com 的 false。如果您要添加^然后它将查找以第一个字符开头的字符串,所以你想要的是!^a.abc.com$。您可能还想在 RewriteCond 末尾添加标志 [NC],以便返回不区分大小写的匹配项。
现在,您的端口 443 虚拟主机的 RewriteCond 也成为上述相同内容的牺牲品。但还有一点我要质疑它的有效性。这可能会导致整个事情中断。您让它监听 HTTPS (*.443) 请求,然后重定向回 HTTP。因此您有一个循环,因为您在应用程序中将其转发到 HTTPS,而 HTTPS 又会将其转发回 HTTP。下面是我如何重写的快速提示(虽然不是 100% 确定,因为我不了解整个环境)
<VirtualHost *:80>
ServerName a.abc.com
ServerAlias b.abc.com bcd.com efg.com
DocumentRoot /var/www/wclp/public
SetEnv APPLICATION_ENV production
RewriteEngine On
RewriteCond %{HTTP_HOST} !^a.abc.com$ [NC]
RewriteRule ^(.*)$ http://a.abc.com/$1 [R=301, L]
</VirtualHost>
<VirtualHost *:443>
ServerName a.abc.com
ServerAlias b.abc.com bcd.com efg.com
DocumentRoot /var/www/wclp/public
SetEnv APPLICATION_ENV production
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/crt.pem
SSLCertificateKeyFile /etc/apache2/ssl/key.pem
RewriteEngine On
RewriteCond %{HTTP_HOST} !^a.abc.com$ [NC]
RewriteRule ^(.*)$ https://a.abc.com/$1 [R=301, L]
</VirtualHost>
不,除非你做了一些疯狂的事情,比如不在端口 443 上使用 SSL,或者在端口 80 上使用 SSL。这样就可以了。如果你通过端口 443 接受非 SSL 传输,那么 1) 你疯了 :) 并且 2) 你可以使用%{HTTPS}
以下是来自 Apache 的两个很好的链接:
在编写复杂规则时,我经常使用参考文档,而当一段时间过去后需要快速复习时,我会使用指南。
希望这有帮助。
答案2
这应该可行,但前提是只配置了这两个虚拟主机。如果您有其他基于名称的虚拟主机,则当 HTTP_HOST 不匹配时,第一个虚拟主机将始终启动。