2011-09-13 9 views
7

私はリソースに対するHTTP_REFERERチェックを行うための一般的な(ホストに依存しない)mod_rewriteルールのセットを探しています。私は直感的に見えた次のを思い付いた、残念ながら動作しません:一般的なmod_rewriteリファラーチェック

RewriteCond %{HTTP_REFERER} !^https?://%{HTTP_HOST}/.* 
# RewriteRule .* - [F] # <- or whatever 

どうやらあなたは比較の両側に変数を持つことができません。だから、ハック:

RewriteCond %{HTTP_HOST}##%{HTTP_REFERER} !^([^#]*)##https?://\1/.* 

でもすごいが、それは醜いだ - そしてあなたが起こっているの内容を正確に把握していない場合、それはひどく混乱します。

これらのルールを書く方が良い(クリーナー)方法はありますか?

+0

は、rewriteCondを使用するとかなり複雑に思えます。おそらくmod_macroは、ホストに依存しないルールの問題を考えるもう一つの方法でしょう。 – regilero

答えて

6

回避策の

まずおめでとう「あなたが起こっているの内容を正確に把握していない場合、それはひどく混乱です」。ソースをチェックすると、mod_rewrite.cはどのような形の変数補間もしていないようですので、私は別の方法を考えることはできません。あなたの "混乱している"点については、なぜコメントがあるのでしょうか?私はあなたの正規表現を整理しました(例えば、*。は冗長です)。そして、あなたが比較をしていることを強調するためのデリムとして使用されます。

不安定に見えるかもしれませんが、あなたの考えはランタイムの点で最適です。

# 
# Is **HTTP_REFERER** of the form http(s)://HTTP_HOST/.... 
# Note that mod_rewrite only does interpolation in the teststring so this is 
# set up in the format AAAA=BBBB and the pattern uses a backreference (\1) to 
# match the corresponding elements of AAAA and BBBB 
# 
RewriteCond %{HTTP_HOST}==%{HTTP_REFERER} !^(.*?)==https?://\1/ 
+1

あなたは両方の天才です。ありがとうございました! –