Apache 2.3 或更高版本

Apache 2.3 或更高版本

是否可以根据以下情况为不同的虚拟主机配置 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请求!所有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 [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

相关内容