2011-09-13 7 views
7

Je suis à la recherche d'un ensemble générique (indépendant de l'hôte) de règles mod_rewrite pour effectuer la vérification HTTP_REFERER sur les ressources. Je suis venu avec ce qui suit qui semblait intuitive, mais ne fonctionne pas malheureusement:Vérification du référent mod_rewrite générique

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

Apparemment, vous pouvez ne pas avoir une variable des deux côtés de la comparaison. Ainsi, un hack:

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

Mais wow, qui est laid - et si vous ne savez pas exactement ce qui se passe, il est terriblement confus.

Existe-t-il un meilleur moyen (plus propre) d'écrire ces règles?

+0

semble assez complexe pour faire cela avec rewriteCond. Peut-être que mod_macro serait une autre façon de penser le problème des règles indépendantes de l'hôte. – regilero

Répondre

6

« si vous ne savez pas exactement ce qui se passe, il est terriblement confus »

Première sur la solution de contournement Congrats. En vérifiant la source, mod_rewrite.c ne semble faire aucune forme d'interpolation de variable, donc je ne peux pas penser à une alternative. Quant à votre point «confus», n'est-ce pas la raison pour laquelle nous avons des commentaires? J'ai également mis de l'ordre dans votre expression rationnelle (par exemple, le caractère final * est redondant) et utilisé = comme délimitation pour souligner que vous faites une comparaison.

Il peut sembler collant, mais votre idée est presque optimale en termes de temps d'exécution.

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

Vous êtes tous les deux des génies. Je vous remercie! –

Questions connexes