13

この質問に対する答えをGoogleとStackOverflowで調べましたが、.htaccessについてよく知らないという事実は、自分の状況に対する正しい答えを判断するのに役立たないので、ここで質問しています。

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

これはすべて正常に機能していますが、正しいドメインにない限り、各サイトがブラウザからお互いの画像などにアクセスできないようにしたかったのです。

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

/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、サイトルートに同じ物理ディレクトリを使用して存在する場合は、次のように、自分のドメインから他のドメインのリソースを調べることができます。

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

これらのディレクトリには機密情報がまったく保存されていないため、これは実際には大きな問題ではありませんが、それはもっと厄介であり、ユーザーがそれを実行できなかった方がいいと思います(これまでのところ誰もがそうしているわけではありません)。

.htaccessファイルを/resourcesディレクトリに入れてみましたが、正規表現などで動かなくなってしまいました。

基本的に、URIに現在のドメイン名が含まれていることを確認したいのですが、そうでない場合は403エラーページにリダイレクトされます。

これは私が思いついたものです:

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}

誰かがこれらの状態で私を助けることができますか?

どんな助けでもいただければ幸いです。

4

2 に答える 2

11

これは素晴らしい質問です。できれば、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 では変数を後方参照として使用できないため、ここでは%特別な正規表現後方参照変数\1を使用していRewriteCondます。

于 2012-06-17T18:01:12.037 に答える
3

この条件は不十分です:

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

で始まらないものをリクエストすると/resources/、403.phpエラーページが表示されるためです。あなたが本当に欲しいのはこのようなものです:

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

または

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

最初の条件がリクエストがリソースに対するものであることを確認し、次に2番目の条件がホストを確認することです。ただし、 mod_rewriteRewriteCondディレクティブは条件の右側で%変数または後方参照を許可せず、左側のみを許可するため、これらはどちらも機能しません。同様に、これも実行できません。

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

RewriteRuleの式には変数を含めることができないため、正規表現であり%{HTTP_HOST}、リクエストで指定されたホストに置き換えるのではなく、文字通りを期待します。したがって、結論として、いいえ、この方法でmod_rewriteの条件を使用してこれを行うことはできません。

サーバー構成または仮想ホスト構成のいずれかにアクセスできる場合に試すことができるのは、RewriteMap%{REQUEST_URI}を作成し、との両方を渡すこと%{HTTP_HOST}です。したがって、マップが呼び出されcheck_hostた場合、ルールは次のようになります。

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

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

于 2012-06-17T08:41:18.217 に答える