![Apache 2.3 或更高版本](https://linux22.com/image/557262/Apache%202.3%20%E6%88%96%E6%9B%B4%E9%AB%98%E7%89%88%E6%9C%AC.png)
是否可以根据以下情况为不同的虚拟主机配置 Apache来源IP?(即相同的接口,相同的主机名,但两个不同的虚拟主机,具有不同的内容,基于来源知识产权。
这样做的目的是,我的 IP 地址可以正常访问网站,而其他人只能访问暂存页面。传统解决方案似乎是使用 mod_rewrite 将访问者引导到同一文档根目录内的单独页面,但我想为暂存页面使用完全不同的文档根目录。
答案1
我不知道在 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
或者类似的东西。:)
答案2
它实际上并不是一个不同的虚拟主机。但使用类似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 子域来处理这个问题可能会更清楚一些。
答案3
Apache 2.3 或更高版本
使用 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>
Apache 2.2 或更早版本
更新:这不是一个好的解决方案。见下文。
您必须进行这样的破解。请注意,[PT]
代表“passthrough”的那个。如果没有它,实际的 HTTP 重定向将被发送回客户端,这可能不是您想要的。[OR]
代表“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
。
更新 mod_rewrite 方法。
这种方法有几个问题。首先,Django 无法像这样在同一个进程中处理两个站点,您需要按照这个答案。
第二mod_rewrite 无法处理POST
请求!所有POST
s 都会被默默地更改为,GET
并且帖子数据会被丢弃。非常令人沮丧!因此我建议您使用...
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
以删除该规则。
请注意,文档建议您需要添加额外的Listen
命令NameVirtualHost
,但我实际上发现它在没有它们的情况下也可以工作,而添加它们会导致它中断(至少在 ubuntu 中)。
答案4
就像@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