2012-12-15 112 views
2

如果我错过了一些简单的事情,尽管我努力尝试设置测试服务器,但我仍然决不是配置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的处理方式完全不同。

事情试过

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

结果

所有请求都根据第一<VirtualHost>容器经由代理指示重定向,即使所使用的子域是NOT code

尽管code虚拟主机是第一个在配置中,但如果子域不是code,则不应使用它,因为客户端请求的ServerName不是code.domain.com

问题

我如何调和这两种配置,这样一个特定子域使用一个虚拟主机,而其他子域使用其他虚拟主机?

配置

<VirtualHost *:80> 
    ServerName code.domain.com 
    ServerAlias code.local 
    ServerAdmin [email protected] 
    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 [email protected] 
</VirtualHost> 
+0

为什么不直接让代码子域指向另一个IP? – rekire

+0

感谢您的意见。假设我只有一个盒子和NIC可以工作,那还能继续吗?回想一下其他服务器在同一个系统上运行。 –

回答

0

我发现了一个配置,对我来说很漂亮。我删除整个虚拟主机的配置,取而代之的是:

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

在/var/www/html/code/.htaccess,我使用P标志的mod_rewrite来代理我的交通需要。

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

VirtualDocumentRoot采用%-3+意味着I can also use more than one dot在我的URL访问目录的名称中的一个点。例如,可使用anothersite.com.domain.com访问anothersite.com的测试服务器,并从/var/www/html/anothersite.com提供文件。

有两个卡口:

  1. 使用通配符CNAME记录这只作品。
  2. www.domain.comdomain.com请求的行为有所不同。
0

上悬而未决你的问题应该不会太难。

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

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

+0

假设我使用第二个虚拟主机作为默认值,我仍然可以使用ProxyPass将流量发送到.htaccess中的其他端口吗? –

+0

如果我不错过应该工作的东西。如果它遇到麻烦,我会尽力帮助你,当我在我的电脑上。在移动设备上编写服务器配置很困难。 – rekire

相关问题