2011-11-08 2 views
0

J'essaye de restreindre l'accès à une page Web avec mod_rewrite, basé sur le referer. L'URL de la page Web est http://www.example.com/path/to/page.php Il est situé sur un serveur Debian dans /var/www/path/to/page.php J'ai une carte de réécriture allowedReferers contenant une liste d'URLrediriger basé sur referer en utilisant mod_rewrite en ignorant les paramètres GET

allowedReferers

http://www.example.com/test/test1.php:white

http://www.example.com/test/test2.php:white

J'ai également les conditions suivantes rewrite/règles

Rewrite

Cond %{HTTP_REFERER} ^(.*)$ 
RewriteCond ${allowedReferers:%1|black} ^black$ [NC] 
RewriteRule /* http://www.someotherplace.com [R,L] 

Jusqu'à présent, cela fonctionne parfaitement bien.

http://www.example.com/test/test1.php

http://www.example.com/test/test2.php

peut accéder au site, tandis que

http://www.example.com/test/test3.php

redirigées sur l'someotherplace.co m.

Mon problème est que, dans la vraie vie, mes références contiendront des paramètres GET. par exemple.

http://www.example.com/test/test1.php?id=245

Mon idée était de réécrire la première condition à quelque chose comme ça

RewriteCond %{HTTP_REFERER} ^(.*)\?.*$ 

ou cette

RewriteCond %{HTTP_REFERER} ^(.*)\?id=[0-9]*$ 

Je l'ai testé à la fois dans Firefox regexes » RegexTester et ils se comportent comme je le veux. appliquée à l'entrée suivante

http://www.example.com/test/test1.php?id=245

ils reviennent cela pour $1:

http://www.example.com/test/test1.php

Je m'y attendais %1 contient aussi l'URL moins les paramètres GET . Alors que, en laissant le reste de la règle inchangée:

RewriteCond ${allowedReferers:%1|black} ^black$ [NC] 
RewriteRule /* http://www.someotherplace.com [R,L] 

devrait entraîner le comportement attendu:

http://www.example.com/test/test1.php?id=234

http://www.example.com/test/test2.php?id=222

peuvent accéder au site Web, alors que

http://www.example.com/test/test3.php?id=256

(ou http://www.athirdplace.com/ etc.)

seront redirigés vers someotherplace.com

Malheureusement, il ne se comporte pas comme prévu du tout. Après avoir appliqué la modification à la première condition, tout référant a accès au site Web.

Comme je voulais voir ce qui est réellement à l'intérieur de %1, je suis venu avec l'idée suivante:

RewriteCond %{HTTP_REFERER} ^(.*)\?id=[0-9]*$ 
RewriteCond ${allowedReferers:%1|black} ^black$ [NC] 

RewriteRule /* %1 [R,L] 

En supposant que se référant à la page de

http://www.example.com/test/test2.php?id=234

me redirigerait à

http://www.example.com/test/test2.php

hypothèse erronée. Il me redirige vers

http://www.example.com/var/www/path/to/

qui est, comme je l'ai mentionné au début, l'adresse de la page dont l'accès doit être limité. Et bien sûr provoque un 404, car /var/www/ est docroot.

Rediriger vers %1 était juste une tentative désespérée pour déboguer mon problème, donc je n'ai pas besoin d'une solution pour y parvenir. Ce que je cherche est un moyen de résoudre mon problème de redirection d'origine. Référants comme ces

http://www.example.com/test/test1.php?id=234

http://www.example.com/test/test2.php?id=222

(quel que soit l'identifiant est passé)

aller à

http://www.example.com/path/to/page.php

alors que tout le reste va à

http://www.someotherplace.com

Enfin, je voudrais également apprécier des idées comment déboguer mod_rewrite, en particulier les moyens de jeter un regard dans des trucs comme %{HTTP_REFERER}, %1, $1, et aime.

Répondre

0

Je viens de trouver une solution comment (au moins partiellement) debug mod_rewrite:

http://www.latenightpc.com/blog/archives/2007/09/05/a-couple-ways-to-debug-mod_rewrite

fournit une astuce très pratique pour produire certaines valeurs mod_rewrite utilise. Je modifié l'exemple un peu, à ce qui suit:

RewriteCond %{HTTP_REFERER} ^(.*)\?id=[0-9]*$ 

RewriteRule (.*) /path/to/mod_rewrite_debugger.php?referer=%{HTTP_REFERER}&p1=%1 [R=301,L,QSA] 

mod_rewrite_debugger.php ne contient que

echo "<pre>"; print_r($_GET); echo "</pre>" 

La sortie est:

[referer] => http://vfh143.beuth-hochschule.de/tests/moodle3.php?id=3 

[p1] => http://vfh143.beuth-hochschule.de/tests/moodle3.php 

Ce qui montre que mon hypothèse initiale était droite.

Malheureusement, le débogueur ne fonctionne plus lorsque la deuxième condition est appliquée:

RewriteCond %{HTTP_REFERER} ^(.*)\?id=[0-9]*$ 

RewriteCond ${allowedReferers:%1|black} ^black$ [NC] 

RewriteRule (.*) /path/to/mod_rewrite_debugger.php?referer=%{HTTP_REFERER}&p1=%1 [R=301,L,QSA] 

produit la sortie suivante:

[referer] => http://vfh143.beuth-hochschule.de/tests/moodle3.php?id=3 

[p1] => 

Transforme que les règles soudainement A travaillé comme initialement prévu. Le problème s'est résolu.

Peut-être que cela aide quelqu'un.

Questions connexes