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


9

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

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


ところで、なぜあなたは、このロジック必要なのですかあなた自身のためのサーバー上の?hostsファイルを使用して、ドメインをテストサーバー(または自分のコンピューター)のIPに自分だけでマッピングできます。
Dan Grossman、2011

処理する名前はいくつかありますか、それとも1つだけですか?名前またはIPで作業(仮想ホストを定義)できるからです。
regilero

別のドキュメントルートを使用する特定の理由
anthonysomerset '08

OPが述べた根拠は意味をなさない(保持ページは書き換えでうまく機能する)が、たとえば、サイトを再加工していて、再加工をホストする方法が必要であり、サブドメインが存在することを知らなかった場合、このようにすることにします。
ウォンブル

Allow / Deny行を使用して、自分以外のすべてのユーザーへのアクセスをブロックし、403エラーのカスタムエラードキュメントを作成できます(ディレクトリに配置して、そのディレクトリへのアクセスを許可してください。そうでない場合、エラードキュメントも403になります)。または書き換えルール/書き換え条件を使用するか、リリース前/テストサイトをdev.example.comのようなサブドメインに移動すると、example.comに保留ページがある可能性があります
汚点

回答:


5

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

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


これは最悪の選択肢になると思います。
ウォンブル

8

実際には別の仮想ホストではありません。しかし、mod_rewritemod_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サブドメインで処理することはおそらく少しクリーンになることに注意してください。


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はこのような同じプロセスで2つのサイトを処理しません。この回答の指示に従う必要があります

次に、mod_rewriteはPOSTリクエストでは機能しません!すべてPOSTのが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 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て、ルールを削除します。

ドキュメントでは、追加のListenおよびNameVirtualHostコマンドを追加する必要があることを示唆していますが、実際にはそれがなくても機能し、それらを追加すると機能しなくなることがわかりました(少なくともubuntuでは)。


2.3+に対するあなたの答えはAlias cannot occur within <Directory/Location/Files> section修正を与えますか?私はこれが本当に必要です:$
ギズモ2018年

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.