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


9

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

这样做的动机是为了使我的IP地址可以正常访问该站点,但其他所有人都可以获取该保留页面。传统的解决方案似乎是使用mod_rewrite将访问者定向到同一docroot中的单独页面,但是我想对保存页面使用完全不同的docroot。


顺便说一句,为什么在服务器上您自己需要这种逻辑?您可以使用自己的主机文件将域映射到测试服务器(或您自己的计算机)的IP。
丹·格罗斯曼

您有几个名字要处理还是只有一个?您可以使用名称或IP来工作(定义虚拟主机)。
regilero

是否有其他文档根目录的任何特定原因?
anthonysomerset 2011年

OP陈述的基本原理没有任何意义(保留页面可以很好地进行重写),但是,例如,如果您正在对网站进行返工,需要一种方式来托管返工,并且不知道存在子域,则可能决定这样做。
womble

您可以使用“允许/拒绝”行来阻止对除您之外的所有人的访问,并具有针对403错误的自定义错误文档(请确保将其放在目录中并允许访问该目录,否则错误文档也将为403),或者使用重写规则/重写条件,或将您的启动前/测试网站移至dev.example.com之类的子域,则example.com可能拥有保留页面
涂抹

Answers:


5

我不知道在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

或类似的东西。:)


我会说这将是最不糟糕的选择。
womble

8

它实际上不是另一台虚拟主机。但是,使用诸如mod_rewritemod_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子域处理此问题可能会更干净一些。


4

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],代表“直通”。没有它,实际的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

更新mod_rewrite方法。

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

其次,mod_rewrite不适用于POST请求!将所有POST静默更改为,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 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以删除规则。

请注意,文档建议你需要添加额外的ListenNameVirtualHost命令,但实际上我发现,它的工作原理没有他们,并加入他们做它打破(至少在Ubuntu)。


您对于2.3+的答案可以Alias cannot occur within <Directory/Location/Files> section解决吗?我真的需要这个:$
Gizmo '18

2

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


1

就像@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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.