尝试使用 apache2 Rewrite 将人们转移到一个网页

尝试使用 apache2 Rewrite 将人们转移到一个网页

我目前正在尝试让人们去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 不匹配时,第一个虚拟主机将始终启动。

相关内容