我有两个网站:OLDSITE 和 NEWSITE。OLDSITE 有 120 个 IP 地址,NEWSITE 有 5 个。我希望能够将 OLDSITE 和 NEWSITE 中的所有内容分开,这样它们就不会绑定在一起,而是在同一台 Linux 计算机上使用它们。我当前的 Apache 设置如下:
Listen 80
NameVirtualHost *
<VirtualHost *>
ServerName oldsite.com
ServerAdmin [email protected]
DocumentRoot /var/www/
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^.]+)\.oldsite\.com$
RewriteCond /home/%1/ -d
RewriteRule ^(.+) %{HTTP_HOST}$1
RewriteRule ^([^.]+)\.oldsite\.com/media/(.*) /home/$1/dir/media/$2
RewriteRule ^([^.]+)\.oldsite\.com/(.*) /home/$1/www/$2
</VirtualHost>
<VirtualHost newsite.com>
ServerName newsite.com
ServerAdmin [email protected]
DocumentRoot /var/newsite/
<Directory /var/newsite/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^.]+)\.newsite\.com$
RewriteCond /home/%1/ -d
RewriteRule ^(.+) %{HTTP_HOST}$1
RewriteRule ^([^.]+)\.newsite\.com/media/(.*) /home/$1/dir/media/$2
RewriteRule ^([^.]+)\.newsite\.com/(.*) /home/$1/www/$2
</VirtualHost>
<VirtualHost *>
ServerName panel.oldsite.com
ProxyPass / http://panel.oldsite.com:10000/
ProxyPassReverse / http://panel.oldsite.com:10000/
<Proxy *>
allow from all
</Proxy>
</VirtualHost>
<VirtualHost *>
ServerName panel.newsite.com
ProxyPass / http://panel.newsite.com:10000/
ProxyPassReverse / http://panel.newsite.com:10000/
<Proxy *>
allow from all
</Proxy>
</VirtualHost>
我希望能够访问 newsite.com 的任何内容,并让其转到 /var/newsite,除非它们是主目录...然后,如果是 panel.newsite.com,我希望它自动执行代理传递到 panel.newsite.com:10000... 使用此设置,它完美适用于 oldsite.com.... 代理和网页... 但是,将 Virtualhost 设置为 newsite.com 会使代理传递失效。如果我将 newsite.com 的 Virtualhost 更改为通配符,代理传递将起作用,但 newsite.com 的任何子域都将不起作用。因此 newsite.com 可以工作,但 www.newsite.com 将无法正确加载。
我假设当所有内容都使用通配符时,ServerName 的作用有点像 RewriteCond,实际上只是将内容应用于该 URL。它使用 Virtualhost * (oldsite.com) 并允许 ANYTHING.oldsite.com 工作,但第二个 virtualhost * (newsite.com) 只有 newsite.com 可以工作……www.newsite.com 则不行。如果我更改它们的顺序,则情况正好相反。所以显然它不喜欢我使用 2 个通配符……
我尝试将 Servername 设为 *.newsite.com ......但这太简单了。我不确定我能做什么来做我想做的事?也许我应该将 ProxyPass 包含在 VirtualHosts 中并使用类似以下内容:
RewriteCond %{HTTP_HOST} ^panel\.newsite\.com$ [NC]
RewriteRule ^(.*)$ http://panel.newsite.com:10000/ [P]
ProxyPassReverse / http://panel.newsite.com:10000/
但它似乎不想登录到 webmin,它会加载登录页面,但无法像 ProxyPass 和 ProxyPassReverse 那样工作。
答案1
如果 Apache 找不到具有匹配的 ServerName 或 ServerAlias 的 VirtualHost,它将使用配置文件中找到的第一个 VirtualHost 作为默认值。使用上述配置,我认为例如“www.newsite.com”最终将由 oldsite.com VirtualHost 处理。
您是否尝试过向两个主要 VirtualHosts 分别添加 ServerAlias 行 - 即
<VirtualHost *>
ServerName oldsite.com
ServerAlias *.oldsite.com
...
</VirtualHost>
<VirtualHost *>
ServerName newsite.com
ServerAlias *.newsite.com
...
</VirtualHost>