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

ith*_*cat 11 ip virtualhost apache-2.2

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

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

mat*_*hew 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>
Run Code Online (Sandbox Code Playgroud)

请注意,使用开发子域处理此问题可能会更简洁一些。


Jan*_*nen 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
Run Code Online (Sandbox Code Playgroud)

或者类似的东西。:)


Tim*_*mmm 5

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>
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

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

sudo a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

请注意,此方法不会完全禁止其他人访问您的测试站点,因此您可能希望添加一些安全性,或者只是选择比next.

更新 mod_rewrite 方法。

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

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

请注意,文档建议您需要添加附加ListenNameVirtualHost命令,但我实际上发现它在没有它们的情况下也能工作,并且添加它们使其中断(至少在 ubuntu 中)。