source IPに基づいて、異なる仮想ホスト用にApacheを設定することは可能ですか? (つまり、同じインターフェイス、同じホスト名、ただし2つの異なる仮想ホストで、内容が異なるsource IPに基づいています。)
これの動機は、私のIPアドレスが適切にサイトにアクセスできるようにするためですが、他のすべての人は保留ページを取得します。従来の解決策は、mod_rewriteを使用してビジターを同じdocroot内の別のページに誘導することですが、代わりに保持ページにまったく異なるdocrootを使用したいと思います。
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
または似たようなもの。 :)
実際には別の仮想ホストではありません。ただし、 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サブドメインで処理することはおそらく少しクリーンになることに注意してください。
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>
更新:これは良い解決策ではありません。下記参照。
あなたはこのようなハックをしなければなりません。 「パススルー」を表す[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
よりもあいまいな接頭辞を選択することをお勧めします。
この方法にはいくつかの問題があります。まず、Djangoは、このような同じプロセスの2つのサイトでは機能しません。 this answer の指示に従う必要があります。
第二にmod_rewriteはPOST
リクエストでは機能しません!すべてのPOST
sは暗黙的にGET
に変更され、投稿データは破棄されます。とてもイライラします!したがって、私はあなたが使用することをお勧めします...
サーバーを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では)ことに注意してください。
私の知る限り、これを行う唯一の方法は、ドキュメントルート内の場所をドキュメントルート外のコンテンツにシンボリックリンクし、リクエストをそれに書き換えることです。
@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