apache2 defaultsite 重定向但不重定向虚拟主机

apache2 defaultsite 重定向但不重定向虚拟主机

我正在尝试设置一个具有多个虚拟主机的新服务器,但如果请求的 fqdn 与虚拟主机不匹配,则请求将被重定向到http://example.com/log.php?url=fqdn

我已经按要求获得了默认主机重定向,但我定义的虚拟主机不起作用。

我正在使用不同的主机和curl -I http://hostname.example.com:8080/命​​令行进行测试,以读取 html 标头来直接检查重定向标头,而不是使用浏览器跟踪它(以避免任何缓存问题)。

我已经将虚拟主机定义为服务器的 fqdn,但当我使用 curl 请求该虚拟主机时,我被重定向。如果我使用任何其他未定义虚拟主机的名称请求服务器,我也会被重定向。

Ubuntu 上的 apache 版本是 2.2.16

配置(按顺序从几个不同的文件连接在一起)如下:

Listen 8080

NameVirtualHost *

<VirtualHost _default_>
        ServerAdmin [email protected]
        RewriteEngine On
        RewriteRule ^(.*)$ http://example.com/log.php?url=%{HTTP_HOST}$1 [R=302,L]
</VirtualHost>

<VirtualHost *>
        <Directory "/var/www">
                allow from all
                Options Indexes
        </Directory>
        DocumentRoot /var/www
        ServerName hostname.example.com
</VirtualHost>

我还尝试了 hostname.example.com:* 和 hostname.example.com:8080 的 ServerName 值


如果我说的不够清楚:

我的服务器请求的anything.anything.any/something 应该重定向到 example.com/log.php?url=anything.anything.any/something

从我的服务器请求的 foo.example.com(未定义为 VirtualHost)应重定向到 example.com/log.php?url=foo.example.com

从我的服务器请求的 hostname.example.com (定义为 VirtualHost)应该返回一个 html 文档

从我的服务器请求的 anothername.example.com (也定义为 VirtualHost)应该返回一个 html 文档


事实证明,由于服务器自己的 fqdn 是 hostname.example.com,因此即使有一个名为 VirtualHost 的虚拟主机,该虚拟主机也会重定向到默认虚拟主机。与服务器 fqdn 不同的其他 fqdn 可以按我的预期工作。

答案1

实现我最初想要的解决方案是,服务器的 fqdn 应该显示一个页面,但任何没有定义名称 VirtualHost 的 fqdn 都会像上面一样重定向,一旦我意识到问题是什么,这个解决方案就很简单了。

因为服务器的 fqdn 始终会显示默认的 VirtualHost,无论是否为 fqdn 定义了任何命名的 VirtualHost,这意味着必须将解决方案写入默认的 VirtualHost。

因此,我添加了一个重写条件,如果主机名与我的服务器 fqdn 不匹配,则应用原始重写规则。此外,由于我使用的是非标准端口,因此必须在条件中定义端口,因为 %{HTTP_HOST} 包含端口号。我通过可选地允许 fqdn 后的任何端口号来做到这一点,因为我以后可能会更改服务器的端口。

<VirtualHost _default_>
        ServerAdmin [email protected]
        RewriteEngine On
        RewriteCond %{HTTP_HOST} !(^hostname\.example\.com[:0-9]*$) [NC]
        RewriteRule ^(.*)$ http://example.com/log.php?url=%{HTTP_HOST}$1 [R=302,L]
        <Directory "/var/www">
                allow from all
                Options Indexes
        </Directory>
        DocumentRoot /var/www
</VirtualHost>

它现在可以与其他命名的 VirtualHosts 一起工作。

相关内容