2011-09-13 18 views
7

Poszukuję ogólnego (niezależnego od hosta) zestawu reguł mod_rewrite dla sprawdzania zasobów przez HTTP_REFERER. Wpadłem na następujących składników, które wydawało intuicyjny, ale niestety nie działa:Generic mod_rewrite referrer check

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

Widocznie nie można mieć zmiennej po obu stronach porównania. Więc hack:

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

Ale wow, to jest brzydki - a jeśli nie wiedzą dokładnie, co się dzieje, to jest strasznie mylące.

Czy istnieje lepszy (czyściejszy) sposób zapisu tych reguł?

+0

wydaje się dość skomplikowane, aby to zrobić z przepisywaniem. Być może mod_macro byłby innym sposobem myślenia o regułach niezależnych od hosta. – regilero

Odpowiedz

6

„jeśli nie wiesz dokładnie, co się dzieje, to jest strasznie mylące”

Pierwsze gratulacje na obejście. Sprawdzając źródło, mod_rewrite.c nie wydaje się tworzyć żadnej formy interpolacji zmiennej, więc nie mogę wymyślić alternatywy. Co do twojego "mylącego" punktu, czy nie dlatego mamy komentarze? Ja również uporządkowałem twoje wyrażenie regularne (np. Końcowy. * Jest zbędny) i użyte = jako kreska dla podkreślenia, że ​​robisz porównanie.

To może wyglądać tandetnie, ale twój pomysł jest bliski optymalnego pod względem czasu wykonywania.

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

Obaj jesteście geniuszami. Dziękuję Ci! –