Apache:普通vhost的一个子域,第二个vhost的其他子域

时间:2012-12-15 06:35:01

标签: apache

请原谅我,如果我在尝试设置测试服务器的过程中错过了一些简单的东西,因为我仍然不是配置Apache的专家。

背景

我有两个要求:

  1. subdomain.domain.com的请求应该来自/var/www/html/subdomain
  2. code.domain.com的请求应由同一系统上的另一台服务器处理,并使用不同的端口。请注意,code是一个固定的子域,不应在与第一个要求相同的规则下处理。换句话说,mysite.domain.com应该从/var/www/html/mysite提供,xyz.domain.com应该从/var/www/html/xyz提供,但code.domain.com的处理完全不同。
  3. 尝试的事情

    要做#1,我使用VirtualDocumentRoot /var/www/html/%1。对于#2,我希望只有code子域使用完全不同的配置,使用ProxyPassProxyPassReverse将流量重定向到端口5000上同一系统上的另一台服务器。

    结果

    根据第一个<VirtualHost>容器,所有请求都通过Proxy指令重定向,即使使用的子域不是code

    虽然code vhost是配置中的第一个,但如果子域不是code,则不应使用它,因为客户端请求的ServerName不是code.domain.com

    问题

    如何协调这两个配置,以便一个特定的子域使用一个虚拟主机,而其他子域使用另一个虚拟主机?

    配置

    <VirtualHost *:80>
        ServerName code.domain.com
        ServerAlias code.local
        ServerAdmin foo@domain.com
        DocumentRoot /var/www/repos
        ErrorLog logs/code.domain.com
        CustomLog logs/code-access common
        ProxyPass / http://localhost:5000/
        ProxyPassReverse / http://localhost:5000/
        <Directory "/var/www/repos">
           DAV On
           Options +Indexes +FollowSymLinks
           AllowOverride All
           Allow from all
           Order allow, deny
        </Directory>
    </VirtualHost>
    
    <VirtualHost *:80>
        UseCanonicalName Off
        VirtualDocumentRoot /var/www/html/%1
        VirtualScriptAlias /var/www/html/%1/cgi-bin
        LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
        CustomLog logs/access_log vcommon
        ServerName domain.com
        ServerAlias localhost
        ServerAdmin foo@domain.com
    </VirtualHost>
    

2 个答案:

答案 0 :(得分:0)

解决你的问题不应该太难。

首先交换两个虚拟主机。第一个是每次默认值。因此,如果没有规则匹配,则每个呼叫都将作为此虚拟主机进行处理。

其次让mod重写将请求移动到正确的目录或为每个有效域创建虚拟主机。最后一个更简单,允许您有单独的日志文件。

答案 1 :(得分:0)

我找到了一个对我来说很漂亮的配置。我删除了整个vhost配置并将其替换为:

<VirtualHost *:80>
    ServerAdmin foo@domain.com
    VirtualDocumentRoot /var/www/html/%-3+
    ServerName domain.com
    ServerAlias localhost
    CustomLog logs/domain.com-access "%V -> %u@%h (%t): %Bb %Dmu"
    ErrorLog logs/error_log
</VirtualHost>

在/var/www/html/code/.htaccess中,我使用mod_rewrite中的P标志来根据需要代理我的流量。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ http://localhost:5000/$1 [L,P]
</IfModule>

%-3+中使用VirtualDocumentRoot表示我的网址中I can also use more than one dot用于访问名称中带点的目录。例如,可以使用anothersite.com访问anothersite.com.domain.com的测试服务器,并从/var/www/html/anothersite.com提供文件。

有两次捕获:

  1. 这仅适用于通配符CNAME记录。
  2. www.domain.comdomain.com请求的行为方式不同。