是否可以基于源 IP 为不同的虚拟主机配置Apache ?(即,基于源 IP ,相同的接口,相同的主机名,但两个不同的虚拟主机,它们具有不同的内容。)
这样做的动机是为了使我的IP地址可以正常访问该站点,但其他所有人都可以获取该保留页面。传统的解决方案似乎是使用mod_rewrite将访问者定向到同一docroot中的单独页面,但是我想对保存页面使用完全不同的docroot。
是否可以基于源 IP 为不同的虚拟主机配置Apache ?(即,基于源 IP ,相同的接口,相同的主机名,但两个不同的虚拟主机,它们具有不同的内容。)
这样做的动机是为了使我的IP地址可以正常访问该站点,但其他所有人都可以获取该保留页面。传统的解决方案似乎是使用mod_rewrite将访问者定向到同一docroot中的单独页面,但是我想对保存页面使用完全不同的docroot。
Answers:
我不知道在Apache级别是否有可能(无论如何都没有mod_rewrite)。
这是另一个想法。如果您设置了两个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之类的内容,您可以从已设置了相应权限的任何文件夹中提供内容。只有一个docroot,但是您可以随时有效地更改它。
一种方法是:
<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子域处理此问题可能会更干净一些。
使用Apache 2.3或更高版本,您显然可以执行以下操作(已测试):
<VirtualHost *:80>
ServerName www.example.com
<If "-R '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 (e.g. 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>
更新:这不是一个好的解决方案。见下文。
您必须这样做。请注意[PT]
,代表“直通”。没有它,实际的HTTP重定向将发送回客户端,这可能不是您想要的。该[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
请注意,此方法不会完全禁止其他人访问您的测试站点,因此您可能希望增加一些安全性,或者只是选择比更为晦涩的前缀next
。
这种方法有两个问题。首先,Django无法在这样的同一过程中使用两个站点,您需要按照此答案中的说明进行操作。
其次,mod_rewrite不适用于POST
请求!将所有POST
静默更改为,GET
并丢弃发布数据。很沮丧!因此,我建议您使用...
只需在两个不同的端口上运行服务器。这包括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 info@example.com
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 info@example.com
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
命令将请求从端口80的IP地址路由到端口1222:
sudo iptables -A PREROUTING -t nat -p tcp -s your.ip.address --dport 80 -j DNAT --to-destination :1222
更改-A
为-D
以删除规则。
请注意,文档建议你需要添加额外的Listen
和NameVirtualHost
命令,但实际上我发现,它的工作原理没有他们,并加入他们做它打破(至少在Ubuntu)。
Alias cannot occur within <Directory/Location/Files> section
解决吗?我真的需要这个:$
就像@Timmmm所说的一样,但是更正了ipmatch语句(请注意“ 10.10.10.10”):ServerName 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 (e.g. 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