2011-09-13 19 views
7

Sto cercando un insieme generico (indipendente dall'host) di regole mod_rewrite per eseguire il controllo HTTP_REFERER sulle risorse. Mi si avvicinò con la seguente che sembrava intuitivo, ma purtroppo non funziona:Controllo referrer mod_rewrite generico

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

A quanto pare non si può avere una variabile su entrambi i lati del confronto. Quindi, un hack:

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

Ma wow, che è brutto - e se non si sa esattamente cosa sta succedendo, è terribilmente confuso.

Esiste un modo migliore (più pulito) per scrivere queste regole?

+0

sembra abbastanza complesso farlo con rewriteCond. Forse mod_macro sarebbe un altro modo di pensare al problema delle regole indipendenti dall'host. – regilero

risposta

6

"se non si sa esattamente cosa sta succedendo, è terribilmente confusa"

primi complimenti per la soluzione. Controllando la fonte, mod_rewrite.c non sembra fare alcuna forma di interpolazione variabile, quindi non posso pensare ad un'alternativa. Per quanto riguarda il tuo punto "confuso", non è questo il motivo per cui abbiamo commenti? Ho anche riordinato la tua espressione regolare (ad esempio il trailing. * È ridondante) e usato = come delim per sottolineare che stai facendo un confronto.

Potrebbe sembrare noioso, ma la tua idea è quasi ottimale in termini di tempo di esecuzione.

# 
# 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

Sei entrambi dei geni. Grazie! –