web-dev-qa-db-ja.com

* source * IPに基づくApache仮想ホスト

source IPに基づいて、異なる仮想ホスト用にApacheを設定することは可能ですか? (つまり、同じインターフェイス、同じホスト名、ただし2つの異なる仮想ホストで、内容が異なるsource IPに基づいています。)

これの動機は、私のIPアドレスが適切にサイトにアクセスできるようにするためですが、他のすべての人は保留ページを取得します。従来の解決策は、mod_rewriteを使用してビジターを同じdocroot内の別のページに誘導することですが、代わりに保持ページにまったく異なるdocrootを使用したいと思います。

9
ithinkihaveacat

Apacheレベルでそれが(とにかくmod_rewriteなしで)可能かどうかはわかりません。

ここに別のアイデアがあります。 2つの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

または似たようなもの。 :)

5

実際には別の仮想ホストではありません。ただし、 mod_rewrite または mod_alias のようなものを使用すると、適切な権限を設定した任意のフォルダーからコンテンツを提供できます。 docrootは1つしかありませんが、その場で効果的に変更できます。

これを行う1つの方法は次のとおりです。

<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サブドメインで処理することはおそらく少しクリーンになることに注意してください。

8
matthew

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]のこと( "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]

次のコマンドを使用して、Debian/Ubuntuで実行できるmod_rewriteを有効にする必要があります。

Sudo a2enmod rewrite

この方法では、他のユーザーがテストサイトにアクセスすることを完全に禁止しているわけではないので、セキュリティを追加するか、nextよりもあいまいな接頭辞を選択することをお勧めします。

Mod_rewriteメソッドを更新します。

この方法にはいくつかの問題があります。まず、Djangoは、このような同じプロセスの2つのサイトでは機能しません。 this answer の指示に従う必要があります。

第二にmod_rewriteはPOSTリクエストでは機能しません!すべてのPOSTsは暗黙的にGETに変更され、投稿データは破棄されます。とてもイライラします!したがって、私はあなたが使用することをお勧めします...

iptablesバージョン

サーバーを2つの異なるポートで実行するだけです。これには、2つの別々のDjangoサイトを持つためのWSGIスタッフが含まれています。

<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コマンドを使用して、ポート80のIPアドレスからポート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

私の知る限り、これを行う唯一の方法は、ドキュメントルート内の場所をドキュメントルート外のコンテンツにシンボリックリンクし、リクエストをそれに書き換えることです。

2
Dan Grossman

@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
1
olivervbk