2

尽管我努力尝试设置测试服务器,但如果我错过了一些简单的事情,请原谅我,因为我仍然不是配置 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子域使用完全不同的配置,将流量重定向到同一系统上端口 5000 上的另一台服务器,使用ProxyPassProxyPassReverse.

结果

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

虽然codevhost 在配置中是第一个,但如果子域不是 NOT ,则不应使用它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>
4

2 回答 2

0

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

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

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

于 2012-12-15T06:43:31.873 回答
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+in的使用VirtualDocumentRoot意味着我还可以在 URL 中使用多个点来访问名称中带有点的目录。例如,anothersite.com可以使用 访问测试服务器anothersite.com.domain.com,并且从 提供文件/var/www/html/anothersite.com

有两个陷阱:

  1. 这仅适用于通配符 CNAME 记录。
  2. www.domain.com并且domain.com请求的行为不同。
于 2012-12-18T04:02:57.957 回答