尝试使用apache2 Rewrite将用户移动到一个网页

我目前正试图让人们去http://a.abc.com (我得到一些X-HTTP头,并保存在一个会话中,我发送到https网站)我总是希望他们去的a.abc.com网站,如果http_host不是a.abc.com我希望他们redirect他们:)

我希望你们能帮忙?

<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> 

起初,它看起来像这样会工作,但经仔细检查,我发现了一些错误。

在您的端口80虚拟主机。 你有!a.abc.com $ 。 这个语句对于b.abc.com来说是正确的,但是它会为ba.abc.com返回false。 如果你在哪里添加一个^expression式,那么它会查找以第一个字符开头的string,所以你想要的是!^ a.abc.com $ 。 你可能也想把标志[NC]加到RewriteCond的末尾,它会返回一个匹配而不区分大小写。

现在你的端口443虚拟主机的RewriteCond成为上述相同的东西的受害者。 但是还有一些我会质疑它的有效性。 这可能会导致整个事件中断。 您可以监听HTTPS(* .443)请求,然后redirect回HTTP。 因此,你有循环,你正在转发它在你的应用程序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上使用它。然后这将起作用。 如果您通过端口443接受非ssl传输,则1)您的疯狂:)以及2)您可以使用%{HTTPS}检查是否为安全通道

这里有两个伟大的链接,从Apache:

  • mod_rewirte参考文档
  • mod_rewrite指南

在编写复杂的规则时,我会使用参考文档,并且在一段时间内使用指南,并且需要快速复习。

希望这有助于。

这应该工作,但只有只有这两个虚拟主机configuration。 如果您有其他基于名称的虚拟主机,如果HTTP_HOST不匹配,第一个虚拟主机将始终启动。