Apache 上的一个域名转到没有 www 的默认页面

Apache 上的一个域名转到没有 www 的默认页面

我在 FreeBSD 10.2 上使用 Apache/2.4.16。我有两个 Apache 实例在运行,每个实例都服务于多个域名。服务器有两个网络接口,一个用于公共 Internet,一个只能通过我的内部 LAN 访问。除了域名和目录之外,所有虚拟主机配置文件几乎相同。所有网站都按预期工作,但有一个除外:如果我尝试访问 adultemployment.net,我会得到服务器的默认页面,但如果我指定 DNS 中配置的任何计算机名称(www、ftp、mail 等),我会按预期获得网站的页面,例如,www.adultemployment.net 显示正确。

这是 adultemployment.net 的虚拟主机配置文件:

<VirtualHost 100.0.193.102:80 192.168.14.202:80>
    ServerName AdultEmployment.net
    ServerAlias *.AdultEmployment.net
    ServerAdmin [email protected]
    DocumentRoot "/path.to/adultemploy/www"
    <Directory "/path.to/adultemploy/www">
        Options All MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    ErrorDocument 404 /cgibin/badurl.pl
    ErrorLog "|/usr/local/sbin/rotatelogs /path.to/adultemploy/logs/error_log 86400"
    CustomLog "|/usr/local/sbin/rotatelogs /path.to/adultemploy/logs/access_log 86400" combined
    <IfModule mod_alias.c>
        ScriptAlias /cgibin/ "/path.to/adultemploy/cgibin/"
        <Directory "/path.to/adultemploy/cgibin">
            AllowOverride None
            Options None
            Require all granted
        </Directory>
    </IfModule>
</VirtualHost>

这是另一个网站(运行正常)的虚拟主机配置文件 bidsadult.com:

<VirtualHost 100.0.193.102:80 192.168.14.202:80>
    ServerName BidsAdult.com
    ServerAlias *.BidsAdult.com
    ServerAdmin [email protected]
    DocumentRoot "/path.to/bidsadult/www"
    <Directory "/path.to/bidsadult/www">
        Options All MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    ErrorDocument 404 /cgibin/badurl.pl
    ErrorLog "|/usr/local/sbin/rotatelogs /path.to/bidsadult/logs/error_log 86400"
    CustomLog "|/usr/local/sbin/rotatelogs /path.to/bidsadult/logs/access_log 86400" combined
    <IfModule mod_alias.c>
        ScriptAlias /cgibin/ "/path.to/bidsadult/cgibin/"
        <Directory "/path.to/bidsadult/cgibin">
            AllowOverride None
            Options None
            Require all granted
        </Directory>
    </IfModule>
</VirtualHost>

默认和虚拟主机配置在httpd.conf中设置:

# 'Main' server configuration
#
# The directives in this section provide defaults for any
#  <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
ServerAdmin [email protected]
ServerName generic.occupant591
#
<Directory />
    AllowOverride none
    Require all denied
</Directory>
#
<IfModule dir_module>
    DirectoryIndex index.php index.cgi index.shtml index.htm index.html
</IfModule>
#
<Files ".ht*">
    Require all denied
</Files>
#
LogLevel info

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    <IfModule ssl_module>
        LogFormat "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" ssl_request
    </IfModule>
    <IfModule logio_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
</IfModule>

<IfModule cgid_module>
    Scriptsock logs/cgisock
</IfModule>

<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-httpd-php         .php
    AddType application/x-tar               .tgz
    AddType text/plain                      .xml
    AddType image/x-icon                    .ico
    AddEncoding x-compress .Z
    AddEncoding x-gzip .gz .tgz
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddHandler cgi-script .cgi
    AddHandler cgi-script .pl
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

<Location /cgi-bin/phf*>
    Deny from all
    ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
</Location>
<Location /cgibin/phf*>
    Deny from all
    ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
</Location>

# 'Main' server configuration
#
# The directives in this file set up the values used by the 'main'
# server, which responds to any requests that aren't handled by any
# other <VirtualHost> definition.
#
Include /path.to.apache.config/conf/generic.site

# Virtual hosts
Include /path.to.apache.config/conf/ActiveSites/*.conf

默认站点配置由generic.site设置:

<VirtualHost 100.0.193.102:80 192.168.14.202:80>
    ServerAdmin [email protected]
    DocumentRoot "/path.to/generic/www"
    <Directory "/path.to/generic/www">
        Options All MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    ErrorDocument 404 /cgibin/badurl-occ.pl
    ErrorLog "|/usr/local/sbin/rotatelogs /path.to/generic/logs-occ/error_log 86400"
    CustomLog "|/usr/local/sbin/rotatelogs /path.to/generic/logs-occ/access_log 86400" combined
    <IfModule mod_alias.c>
        ScriptAlias /cgibin/ "/path.to/generic/cgibin/"
        <Directory "/path.to/generic/cgibin">
            AllowOverride None
            Options None
            Require all granted
        </Directory>
    </IfModule>
</VirtualHost>

我尝试通过将功能配置文件复制到 adultemployment.net 的配置文件上并更新域名和目录条目来解决这个问题。但这并没有改变任何东西。我尝试了几组不同的 ServerName 和 ServerAlias 条目,例如

    ServerName www.AdultEmployment.net
    ServerAlias *.AdultEmployment.net AdultEmployment.net

    ServerName www.AdultEmployment.net
    ServerAlias *.AdultEmployment.net

我认为问题可能是因为 adultemployment.net 在 ActiveSites 目录中按字母顺序排在第一位,所以我在它前面添加了另一个域 - 并且该网站按预期运行,但是 adultemployment.net仍然如果没有机器名称则不会返回其页面。

起初我以为这可能是浏览器缓存问题,但我在 w2K 机器上使用 Firefox 和 IE、在 w7 笔记本电脑上使用 Firefox 以及通过 lynx ssh 进入外部托管公司的 shell 时,都遇到了同样的问题。我还尝试清除服务器上域的 arp 条目,但无济于事。

我尝试调整 DNS 条目,并按照建议查找符号链接这里或建议的 .htaccess 条目这里类似的问题,但似乎没有什么可以解决这个问题服务器上的站点出现故障,但是全部其余的都可以正常工作。

我已经尝试解决这个问题一个多星期了,刚发现这个问题时断断续续,过去两天几乎一直在尝试。任何提示或指示都会大大感谢!!

答案1

我偶然发现了一个“解决方案”(实际上是一种变通方法,其根本原因仍不清楚):

为了配置(启动时加载的第二个 Apache 配置),我必须将ServerNamehttpd.conf 中的信息复制到 generic.site 配置文件中:

ServerName generic.occupant591

添加“默认”后ServerName条目后,全部所服务的网站Apache 配置正常工作。如果在其他配置(启动时加载的第一个配置),与“默认”条目匹配的站点ServerName会失败。

TL;DR;

如果访问者尝试访问未配置域中不存在的页面(即一个适当地通过 generic.site 配置提供服务)例如mature.bid/视频,由于通用站点没有名为的文件或目录,因此[core:info]在错误日志中写入了一条包含以下消息的条目File does not exist: /web/generic-occ/www/videosvideos,因此 Apache 无法提供任何内容来响应请求。虽然错误日志条目说明了请求的页面不存在,但它们没有提供任何信息领域有关请求的信息,因此实际上只是噪音。

我使用 Apache 常用的“组合”日志格式来生成访问日志。同样,访问日志指示了被访问的页面,但没有指示请求的域。对于日志记录单个域信息的正常配置,这不是问题,但 generic.site 配置旨在回答全部未配置的域,因此记录域信息是必需的在这种情况下很有用。幸运的是,Apache 提供了记录域信息的选项,并且%v处理请求的服务器的规范 ServerName“这似乎正是我所需要的。我创建了一个新的 LogFormat 语句:

LogFormat "%h %l %u %t %v \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" host_combined

我重新启动了 Apache,尝试加载http://adultemployment.net再次,发现访问日志包含一个条目,其中包括“AdultEmployment.net "GET / HTTP/1.1" 太好了,我想,这有效!” - 直到我注意到访问未配置的域时记录了相同的文本。也许我应该使用%V根据 UseCanonicalName 设置的服务器名称获取域信息?我将 LogFormat 命令更改为

LogFormat "%h %l %u %t %V \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" host_combined

然后重新启动 Apache - 发现包含不存在页面的域正如我所料被记录下来。现在我记录了哪些未配置的站点正在被访问,以及访问者希望它们拥有哪些页面。

这让我很疑惑为什么 LogFormat%v字符串会记录“成人就业网“ 作为 ”处理请求的服务器的规范 ServerName“-没有任何配置文件的编写方式是,AdultEmployment.net 应为默认服务器名称。(对于此计算机上的其他 Apache 配置,%v记录的字符串是“梦想家“- 服务器的 O/S 机器名称。)我现在找不到该页面,但在我之前的研究中,我遇到了一种情况,通过将域名更改为与操作系统的服务器名称不同,可以解决类似的问题。我尝试通过 ssh 进入此 Apache 配置的 IP 地址,以查看 AdultEmployment.net 是否显示为操作系统配置的一部分 - 但事实并非如此,正如我所料。

作为一个预计会引起问题的实验,我尝试ServerName在 generic.site 配置文件中添加一个条目:

ServerName Dreamer.occupant591.net

我以为这可能会解决成人就业网(确实如此),但我预计它也会破裂occupant591.net,导致显示未配置的站点页面。但是,它确实不是破坏“主机”站点 — — 事实上,现在我还没能发现任何失败的地方。

由于apache2ctl -S(如上所述)这里) 在 FreeBSD 上的 Apache 2.4 中不可用,我阅读了httpd手册页,发现-S有一个选项可以直接传递给守护进程。使用ServerNamegeneric.site 配置中的条目,httpd -S报告以以下内容开头

VirtualHost configuration:
192.168.14.202:80      is a NameVirtualHost
         default server Dreamer.occupant591.net (/path.to.apache.config/conf/generic.site:6)
         port 80 namevhost Dreamer.occupant591.net (/path.to.apache.config/conf/generic.site:6)
         port 80 namevhost AAAAAAAAA-Dummy.com (/path.to.apache.config/conf/ActiveSites/AAAAAAAA-Dummy.conf:2)
                 wild alias *.AAAAAAAAA-Dummy.com
         port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/ActiveSites/AdultEmployment.net.conf:3)
                 wild alias *.AdultEmployment.net

当我ServerName从 generic.site 配置中删除条目时,httpd -S报告以以下内容开头

VirtualHost configuration:
192.168.14.202:80      is a NameVirtualHost
         default server AdultEmployment.net (/path.to.apache.config/conf/generic.site:6)
         port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/generic.site:6)
         port 80 namevhost AAAAAAAAA-Dummy.com (/path.to.apache.config/conf/ActiveSites/AAAAAAAA-Dummy.conf:2)
                 wild alias *.AAAAAAAAA-Dummy.com
         port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/ActiveSites/AdultEmployment.net.conf:3)
                 wild alias *.AdultEmployment.net

请注意,如果没有该ServerName条目,则默认服务器仍被设置为generic.site:6 即使文件中没有 ServerName 条目,位于文件的第 6 行或任何其他行。 清楚地有东西坏了但我现在没时间再去追逐这个鬼魂了。

当我最初在服务器上设置这个带有两个实例的 Apache 配置时,我ServerName在另一个实例的配置中有一个包含完整域名的条目。这导致“主机”站点崩溃,我修复了问题可以通过从 httpd.conf 中的条目中删除顶级域组件ServerName以及ServerName从 generic.site 配置文件中完全删除该条目来解决。我对此配置进行了相同的更改,这似乎有效,直到我重新配置网络以摆脱 ISP 的路由器时才如此。下次我尝试访问成人就业网,我发现了我的问题中描述的问题。

现在我很困惑为什么 Apache 的两个实例表现不同 - 但我不得不推迟这项调查,因为那时我无事可做,也没有员工可以和我一起做……

相关内容