2012-06-17 5 views
12

GoogleとStackOverflowでこの質問に対する答えを見てきましたが、.htaccessについてよくわからないという事実は正しい答えを決定するのに役立ちません私の状況のた​​めに、私はここで尋ねています。.htaccess RewriteCond URIにドメインが含まれていない

私の状況では、サーバー上のルートと同じ物理ディレクトリを使用しているいくつかのサイトがあります。

これはうまくいきましたが、正しいドメインに属していない限り、各サイトがブラウザから画像などにアクセスできないようにしたいと考えていました。

現在、私はこのようなファイル構造を持っている:

/resources/{resource}/{full_domain_name} 

ですから、例えばwww.domain.co.ukのために、このような構造なければなりません:

http://www.domain.co.uk/resources/images/www.domain.co.uk/some_image.jpg 

をしかしwww.domain_2.co.ukは、サイトの同じ物理ディレクトリを使用して存在している場合rootの場合、次のように自分のドメインから他のドメインのリソースを見ることができます:

http://www.domain_2.co.uk/resources/images/www.domain.co.uk/some_image.jpg 

これらのディレクトリには機密情報が全く格納されていないので、これは実際には大きな問題ではありませんが、迷惑になり、ユーザーがこれを行うことができなくなります。

そうでない場合は403にリダイレクト私は基本的にURIが現在のドメイン名が含まれていることを確認する

などのI /リソースディレクトリに.htaccessファイルを入れてみましたが、私は正規表現とこだわっていますエラーページ。

これは私が思い付いたものです:いくつかのフォルダがあるので、私は[^/]ビットに入れた理由は、例えば、

RewriteCond %{REQUEST_URI} !^(/resources/[^/]*/%{HTTP_HOST})(.*)$ 
RewriteRule ^(.*)$ /error/403.php 

/resources/images/{full_domain_name} 
/resources/scripts/{full_domain_name} 
/resources/stylesheets/{full_domain_name} 

誰がこれらで私を助けてもらえ条件?

ご協力いただければ幸いです。

+0

現在のルールの結果はどうなりますか? */resources/[^ /] * /%{HTTP_HOST}の周りに '()'を必要としない点を除いて、うまくいくようです。* ' –

+0

@Michael現在私がwww.domain.coにいる場合.ukとwww.domain.co.uk/resources/stylesheets/www.domain.co.uk/style.cssに行きます。たとえば、私は/error/403.phpファイルにリダイレクトされます。 .htaccessルールを削除すると、正常に実行されるはずのファイルが検索されます。 –

+0

正規表現で表現されている '%{REQUEST_URI} '全体は実際には必要ありません。 http_host 'RewriteCond%{REQUEST_URI}!^。+%{HTTP_HOST} 'と一致することができます。 –

答えて

10

これは素晴らしい質問です。もし私ができるならば、私は10回以上アップしたでしょう。答えを出すために私が実際にApacheのリソースをすべて掘り下げなければならなかったので、あなたがここで受け入れられた答えを持っていても、私は自分の答えを投稿しています。ここでは、この問題のために必要とするルールがある:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{HTTP_HOST}:%{REQUEST_URI} !^([^:]+):/resources/[^/]+/\1/.+ [NC] 
RewriteRule ^resources/[^/]+/[^/]+/.+ - [F,NC,NE] 

PS:私たちはRHS上%変数などのバックリファレンスを使用することはできませんので、私はここRewriteCondに特別な正規表現の後方参照変数\1を使用しています。

+1

私は通常これをやっていませんが、これが問題の完璧な解決策を提供するので、私の受け入れられた答え。あなたの回答を投稿していただきありがとうございますanubhava、それは非常に感謝しています! –

+0

あなたは大歓迎で、このような興味深い問題を投稿してくれてありがとう、私に新しいmod_rewriteトリックを学ばせてくれてありがとう)。 – anubhava

3

この条件は不十分である:

RewriteCond %{REQUEUST_URI} !^(/resources/[^/]*/%{HTTP_HOST})(.*)$ 

私は/resources/で始まらない何かを要求した場合、私は403.phpエラーページを取得しますので。最初の条件は、2番目のホストをチェックし、要求がリソースのためのものであることを確認して

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteCond %{HTTP_HOST} !%1 

それとも

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteCond %{REQUEST_URI} !^/resources/[^/]+/%{HTTP_HOST}/ 

:何が本当に欲しいのはこのようなものです。 これはですが、mod_rewriteのRewriteCondディレクティブでは、条件の右側に変数または後方参照があり、左側のみの変数または後方参照が許可されていないため動作しません。同様に、あなたがこれを行うことはできませんいずれか:それは正規表現だからのRewriteRuleの式は、その中の変数を持つことができない、それは文字通りの要求で与えられたホストとそれを置き換えるのではなく%{HTTP_HOST}を期待

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteRule !^/resources/[^/]+/%{HTTP_HOST}/ /error/403.php 

ので。結論として、いいえ、mod_rewriteの条件ではこれを行うことはできません。

サーバー設定またはvhost設定にアクセスできる場合は、RewriteMapを作成し、%{REQUEST_URI}%{HTTP_HOST}の両方を渡すことができます。だからあなたのマップがcheck_host呼び出された場合、その後、あなたのルールは次のようになります。

RewriteRule ^resources/[^/]+/([^/]+)/ ${check_host:%{HTTP_HOST}_%{REQUEST_URI}} 

そして、あなたのスクリプトは、単に、入力を解析最初_からそれを分割し、リクエストURIを解析し、必ずホストを作成する必要があります。 HTTP_HOSTと同じです。同じ場合は同じリクエストURIを出力し、そうでない場合はエラーURIを出力します。サーバーや仮想ホストの設定にアクセスできない場合は、運が悪いと思います。 RewriteMapをhtaccessファイルで定義することはできません。

+0

この回答をありがとうJon Lin。 RewriteCondの右側に%変数または後ろの参照を置くことができなかったことはわかりませんでした。私はRewriteMapを試してみましたが、何らかの理由でそれができない場合、私はmod_rewriteの外で別の方法を見つけるだろうと確信しています:) –

関連する問題