2011-09-13 14 views
7

Estoy buscando un conjunto genérico (independiente del host) de reglas mod_rewrite para hacer HTTP_REFERER comprobando los recursos. Se me ocurrió lo siguiente, que parecía intuitiva, pero lamentablemente no funciona:Comprobación genérica de referencia de mod_rewrite

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

Al parecer, no se puede tener una variable en ambos lados de la comparación. Por lo tanto, un truco:

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

Pero wow, eso es feo - y si usted no sabe exactamente lo que está pasando, es terriblemente confuso.

¿Existe alguna forma mejor (más limpia) de redactar estas reglas?

+0

parece bastante complejo hacer eso con rewriteCond. Quizás mod_macro sería otra forma de pensar el problema de las reglas independientes del host. – regilero

Respuesta

6

"si usted no sabe exactamente lo que está pasando, es terriblemente confuso"

primeras felicitaciones por la solución. Comprobando la fuente, mod_rewrite.c no parece hacer ninguna forma de interpolación variable, así que no puedo pensar en una alternativa. En cuanto a su punto "confuso", ¿no es por eso que tenemos comentarios? También he ordenado su expresión regular (por ejemplo, el final. * Es redundante) y se usa = como un delimitado para enfatizar que está haciendo una comparación.

Puede parecer hortera, pero su idea es casi óptima en términos de tiempo de ejecución.

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

Ambos son genios. ¡Gracias! –