ith*_*cat 11 ip virtualhost apache-2.2
是否可以根据源IP为不同的虚拟主机配置 Apache ?(即相同的接口,相同的主机名,但两个不同的虚拟主机,具有不同的内容,基于源IP。)
这样做的动机是我的 IP 地址可以正确访问该站点,但其他人都可以访问保留页面。传统的解决方案似乎是使用 mod_rewrite 将访问者引导到同一 docroot 中的单独页面,但我想为保留页面使用完全不同的 docroot。
它不会真的是一个不同的虚拟主机。但是使用诸如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>
Run Code Online (Sandbox Code Playgroud)
请注意,使用开发子域处理此问题可能会更简洁一些。
我不知道这在 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
Run Code Online (Sandbox Code Playgroud)
或者类似的东西。:)
使用 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>
Run Code Online (Sandbox Code Playgroud)
更新:这不是一个好的解决方案。见下文。
你必须像这样进行黑客攻击。请注意[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]
Run Code Online (Sandbox Code Playgroud)
您需要mod_rewrite
使用以下命令启用您可以在 Debian/Ubuntu 上执行的操作:
sudo a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)
请注意,此方法不会完全禁止其他人访问您的测试站点,因此您可能希望添加一些安全性,或者只是选择比next
.
这种方法有几个问题。首先,Django 不会像这样在同一进程中处理两个站点,您需要按照此答案中的说明进行操作。
其次mod_rewrite 不适用于POST
请求!所有POST
s 都被静默更改为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>
Run Code Online (Sandbox Code Playgroud)
然后您可以使用此iptables
命令将请求从您的 80 端口上的 ip 地址路由到端口 1222:
sudo iptables -A PREROUTING -t nat -p tcp -s your.ip.address --dport 80 -j DNAT --to-destination :1222
Run Code Online (Sandbox Code Playgroud)
更改-A
为-D
以删除规则。
请注意,文档建议您需要添加附加Listen
和NameVirtualHost
命令,但我实际上发现它在没有它们的情况下也能工作,并且添加它们使其中断(至少在 ubuntu 中)。
归档时间: |
|
查看次数: |
17838 次 |
最近记录: |