2011-09-13 27 views
7

我正在尋找一個mod_rewrite規則的通用(主機無關)集合,用於在資源上執行HTTP_REFERER檢查。我想出了以下看起來很直觀,但可悲的是不起作用:通用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

你們都是天才。謝謝! –