基于* source * IP的Apache虚拟主机

是否可以根据 IP为不同的虚拟主机configurationApache? (即基于 IP的相同接口,相同主机名,但具有不同内容的两个不同虚拟主机)。

这样做的动机是,我的IP地址可以访问正确的网站,但其他人都拿到页面。 传统的解决scheme似乎是使用mod_rewrite将访问者引导到同一个文档根目录中的一个单独的页面,但是我想使用完全不同的文档根目录来代替。

我不知道是否可能(不pipemod_rewrite,无论如何)在Apache级别。

这是另一个想法。 如果您设置了两个Apache虚拟主机,然后使用iptables将访问者透明地转发到正确的虚拟主机,该怎么办? 就像是

iptables -A PREROUTING -t nat -i eth0 -p tcp -s your.ip.address -d your.server --dport 80 -j DNAT --to-destination your.actual.site:someport iptables -A PREROUTING -t nat -i eth0 -p tcp ! -s your.ip.address -d your.server --dport 80 -j DNAT --to-destination your.holding.site:someport 

或类似的东西。 🙂

它不会是一个不同的虚拟主机。 但是使用类似mod_rewrite或者mod_alias的东西,你可以为你设置了适当权限的任何文件夹提供内容。 只有一个文件根目录,但是你可以实时改变它。

一种方法可能是:

 <VirtualHost *.80> ServerName example.com ... DocumentRoot "/path/to/root" <Directory "/path/to/root"> ... </Directory> <Directory "/path/to/not/root"> Order allow,deny #replace with your IP Allow from 192.168.0.100 ... </Directory> RewriteEngine On #Rewrite to alternate path if IP address matches RewriteCond %{REMOTE_ADDR} ^192\.168\.0\.100$ RewriteRule ^/(.*)$ /path/to/not/root/$1 <VirtualHost> 

请注意,虽然它可能会更清洁,处理这个与dev子域。

AFAIK,这样做的唯一方法是将文档根目录中的位置符号链接到文档根目录之外的内容,然后重写请求。

Apache 2.3或更高版本

与Apache 2.3或更高版本,你可以做这样的事情(未testing):

 <VirtualHost *:80> ServerName www.example.com <If "%{REMOTE_ADDR} -ipmatch '10.10.10.10/32' "> # The next version of the website... Alias /favicon.ico /home/ubuntu/website-new/favicon.ico Alias /static/ /home/ubuntu/static/ WSGIScriptAlias / /home/ubuntu/website-new/main/wsgi.py </If> <Else> # The standard version (eg holding page). Alias /favicon.ico /home/ubuntu/website/favicon.ico Alias /static/ /home/ubuntu/static/ WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py </Else> # and so on... </VirtualHost> 

Apache 2.2或更早的版本

更新:这不是一个好的解决scheme。 见下文。

你必须这样做一个黑客。 请注意代表“passthrough”的[PT] 。 没有它,一个实际的HTTPredirect被发送回客户端,这可能不是你想要的。 [OR] (表示“或”)表示如何匹配多个地址。

 Alias /next/favicon.ico /home/ubuntu/website-new/favicon.ico Alias /next/static/ /home/ubuntu/static/ WSGIScriptAlias /next /home/ubuntu/website-new/main/wsgi.py Alias /favicon.ico /home/ubuntu/website/favicon.ico Alias /static/ /home/ubuntu/static/ WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py # Rewrite for our IP. RewriteEngine On RewriteCond %{REMOTE_ADDR} ^80\.4\.170\.209$ [OR] RewriteCond %{REMOTE_ADDR} ^94\.193\.52\.157$ RewriteRule ^/(.*) /next/$1 [PT] 

您需要启用mod_rewrite ,您可以使用以下命令在Debian / Ubuntu上执行此操作:

 sudo a2enmod rewrite 

请注意,这种方法并不完全禁止其他人访问您的testing网站,所以您可能会想要添加一些安全性,或只是select一个比next一个更晦涩的前缀。

更新mod_rewrite方法。

这种方法有几个问题。 首先,Django不能像这样在同一个进程中使用两个站点,您需要按照此答案中的说明进行操作。

其次mod_rewrite不适用于POST请求 ! 所有的POST被无声地更改为GET ,并且发布的数据被丢弃。 非常沮丧! 所以我build议你使用…

iptables版本

只需在两个不同的端口上运行服务器。 这其中包括WSGI的东西有两个独立的Django站点。

 <VirtualHost *:80> ServerName www.example.com Alias /favicon.ico /home/ubuntu/alpha/favicon.ico Alias /static/ /home/ubuntu/alpha/static/ WSGIDaemonProcess alpha_wsgi user=www-data group=www-data WSGIScriptAlias / /home/ubuntu/alpha/alpha/wsgi.py WSGIProcessGroup alpha_wsgi ServerAdmin [email protected] ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <VirtualHost *:1222> ServerName www.example.com Alias /favicon.ico /home/ubuntu/main/favicon.ico Alias /static/ /home/ubuntu/main/static/ WSGIDaemonProcess main_wsgi user=www-data group=www-data WSGIScriptAlias / /home/ubuntu/main/main/wsgi.py WSGIProcessGroup main_wsgi ServerAdmin [email protected] ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> 

然后,您可以使用此iptables命令将您的IP地址在端口80上的请求路由到端口1222:

 sudo iptables -A PREROUTING -t nat -p tcp -s your.ip.address --dport 80 -j DNAT --to-destination :1222 

-A更改为-D以删除该规则。

请注意,文档build议您需要添加更多的ListenNameVirtualHost命令,但是实际上我发现它的工作方式没有它们,添加它们会使其中断(至less在Ubuntu中)。

就像@Timmmm说的,但纠正了ipmatch语句(注意'10.10.10.10'):ServerName http://www.example.com

 <If "%{REMOTE_ADDR} -ipmatch '10.10.10.10'"> # The next version of the website... Alias /favicon.ico /home/ubuntu/website-new/favicon.ico Alias /static/ /home/ubuntu/static/ WSGIScriptAlias / /home/ubuntu/website-new/main/wsgi.py </If> <Else> # The standard version (eg holding page). Alias /favicon.ico /home/ubuntu/website/favicon.ico Alias /static/ /home/ubuntu/static/ WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py </Else> # and so on... 

否则会显示错误:

 Cannot parse condition clause: -ipmatch requires subnet/netmask as constant argument