我有一个 CentOS 7服务器,大约有20个域都使用/etc/httpd/conf.d中的 vhosts文件自动管理。
我正在尝试学习 Django ,并希望使用它来设置一个域,因此我在.conf文件中添加了一个特定的虚拟主机。
结果是Django域工作正常,但所有其他站点都坏了(尝试使用Django但导致错误)。
Django域有两个文件夹: djangodomain.com 用于静态文件, djangodomain.app 用于Python文件。
如何将单个Django域集成到现有的多域虚拟主机设置中?
现有的vhosts.conf:
<VirtualHost *:80>
serveradmin username@domain.com
serveradmin username@domain.com
usecanonicalname off
# www.site.com » site.com
rewriteengine on
rewritecond %{HTTP_HOST} ^www\.(.*)$ [nc]
rewriterule ^(.*)$ http://%1 [r=301,l]
# file locations
virtualdocumentroot "/home/username/%0"
<directory "/home/username/*">
allowoverride all
require all granted
options indexes followsymlinks
options +execcgi
options +includes
</directory>
</VirtualHost>
我添加的内容打破了除Django网站之外的所有内容:
<VirtualHost djangodomain.com:80>
ServerName djangodomain.com
ServerAlias www.djangodomain.com
ServerAdmin user@domain.com
DocumentRoot /home/username/djangodomain.com
WSGIScriptAlias / /home/username/djangodomain.app/django.wsgi
<Directory /home/username/djangodomain.app>
Order allow,deny
Allow from all
</Directory>
Alias /robots.txt /home/username/djangodomain.com/robots.txt
Alias /favicon.ico /home/username/djangodomain.com/favicon.ico
Alias /images /home/username/djangodomain.com/images
Alias /static /home/username/djangodomain.com/static
ErrorLog /home/username/djangodomain.logs/error.log
CustomLog /home/username/djangodomain.logs/access.log combined
</VirtualHost>
答案 0 :(得分:0)
当Apache获取HTTP请求时,它需要知道应该处理此请求的虚拟主机。现在,它的工作方式是。 Apache获取客户端请求所涉及的IP地址(服务器IP,而不是客户端),并通过虚拟主机定义列表查找为该IP定义的任何虚拟主机。如果有多个,它将查看Host标头并尝试将其与特定的ServerName或ServerAlias指令相匹配。如果它仍然找不到,它将寻找默认的虚拟主机。
您有两个虚拟主机定义。如果端口80 <VirtualHost *:80>
上的默认vhost,则为一个。这是默认值,因为它具有*用于IP。另一个特定于IP地址<VirtualHost djangodomain.com:80>
。它使用的IP是djangodomain.com解析的任何内容。
因此,任何来自该IP的请求都将由IP特定配置处理,然后才允许其进入默认状态。
要解决此问题,您需要将{django虚拟主机指令替换为<VirtualHost *:80>
,与其他虚拟主机相同。这应该将它们全部置于相同的解析优先级,它只使用Host头来计算其余部分。
如果您正在运行具有20多个虚拟主机的Web服务器,那么您真的需要更好地了解它的工作原理。有空的时候阅读HTTP和网络托管。