我正在尝试设置一个具有多个虚拟主机的新服务器,但如果请求的 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 一起工作。