Apache 未从预期位置提供文件

Apache 未从预期位置提供文件

我有以下虚拟主机配置:

<VirtualHost *>
    ServerName books.domain.com
    ServerAlias ebooks.domain.com
    DocumentRoot /home/media/books/
    <Directory /home/media/books>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    ErrorLog /home/domain.com/logs/error.log
    CustomLog /home/domain.com/logs/access.log combine
    ServerSignature Off
</VirtualHost>
<VirtualHost *>
    ServerName domain.com
    ServerAlias domain.info domain.net domain.org *.domain.com *.domain.info *.domain.net *.domain.org
    DocumentRoot /home/domain.com/public_html/
    <Directory /home/domain.com/public_html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    ErrorLog /home/domain.com/logs/error.log
    CustomLog /home/domain.com/logs/access.log combine
    ServerSignature Off
</VirtualHost>

domain.com 在两个虚拟主机指令中是相同的

问题是 books.domain.com 正在从/home/domain.com/public_html/目录提供服务

答案1

可能是因为你有 domain.com 的 ServerAlias 规则

*.domain.com

这将匹配 ebooks.domain.com 并提供服务

/home/domain.com/public_html

我最好的建议是使用 mod_rewrite,RewriteCond %{HTTP_HOST}但不幸的是,我了解的还不够多,无法给你更多细节。请查看 mod_rewrite 手册/指南。

答案2

我原本以为顺序是这里的关键,Apache 将提供第一个匹配的服务器名,但我做了一个快速测试,情况似乎并非如此。它似乎总是匹配通配符,无论它们的顺序如何。

我能想到的最好的办法就是使用一个 IP 地址,就像 Evgeny 建议的那样,有一个虚拟主机,并对 books.domain 使用代理重定向。

<VirtualHost *>
    ServerName domain.com
    ServerAlias domain.info domain.net domain.org *.domain.com *.domain.info *.domain.net *.domain.org
    DocumentRoot /home/domain.com/public_html/
    <Directory /home/domain.com/public_html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    ErrorLog /home/domain.com/logs/error.log
    CustomLog /home/domain.com/logs/access.log combine
    ServerSignature Off

    <Directory /home/media/books>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    Alias /home/media/books /books
    RewriteRule   ^books\.domain\.com(.*)$      http://domain.com/books$1 [NC,P,L]
    RewriteRule   ^ebooks\.domain\.com(.*)$     http://domain.com/books$1 [NC,P,L]

</VirtualHost>

我能想到的唯一保留通配符和独立虚拟主机的方法是,如果你有两个 IP 地址,并将两个虚拟主机分配给不同的地址。不过,我仍然觉得一定有更好的方法可以做到这一点,我对其他解决方案很感兴趣。

答案3

我认为叶夫根尼做得很好。

需要了解:NameVirtualHost 指令的值必须与 的内容完全匹配,并且两者都不能是主机名。例如,NameVirtualHost *:80 必须与 一起使用。“NameVirtualHost *:80”在配置中只能出现一次。

答案4

您是否有“NameVirtualHost *:80”或类似的全局配置行?

当虚拟主机在 Apache 中无法工作时,通常就是因为这个原因造成的。

相关内容