перенаправление на основе реферера с использованием mod_rewrite без учета параметров GET - PullRequest
0 голосов
/ 09 ноября 2011

Я пытаюсь ограничить доступ к веб-странице с помощью mod_rewrite на основе реферера. URL веб-страницы http://www.example.com/path/to/page.php Он расположен на сервере Debian в /var/www/path/to/page.php У меня есть карта перезаписи allowedReferers, содержащая список URL

allowedReferers

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

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

У меня также есть следующие условия / правила перезаписи

Перепишите

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

Пока это работает на отлично.

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

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

Может получить доступ к веб-сайту, в то время как

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

перенаправляется на someotherplace.com.

Моя проблема в том, что в реальной жизни мои рефереры будут содержать параметры GET. например, * +1043 *

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

Моя идея состояла в том, чтобы переписать первое условие примерно так:

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

или это

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

Я протестировал оба регулярных выражения в RegexTester в Firefox, и они ведут себя так, как я хочу. Применяется к следующему входу

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

они возвращают это для $1:

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

Я ожидал, что %1 также содержит URL минус параметры GET. Так что, оставляя остальные правила без изменений:

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

должно привести к ожидаемому поведению:

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

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

может получить доступ к сайту, а

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

(или http://www.athirdplace.com/ и т. Д.)

будет перенаправлен на someotherplace.com

К сожалению, он не ведет себя так, как ожидалось. Применив изменение к первому условию, внезапно каждый рефери имеет доступ к сайту.

Поскольку я хотел увидеть, что на самом деле находится внутри %1, я пришел к следующей идее:

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

RewriteRule /* %1 [R,L]

Предполагая, что ссылка на страницу с

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

перенаправит меня на

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

Неправильное предположение. Это перенаправляет меня на

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

, который, как я упоминал в начале, является адресом страницы, доступ к которой должен быть ограничен. И, конечно, провоцирует 404, поскольку /var/www/ является докрутом.

Перенаправление на %1 было просто отчаянной попыткой отладить мою проблему, поэтому мне не нужно решение для достижения этой цели. То, что я ищу, это способ решить мою первоначальную проблему перенаправления. Рефералы, подобные этим

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

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

(независимо от того, какой идентификатор передан)

перейти к

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

пока все остальное уходит на

http://www.someotherplace.com

Наконец, я также был бы признателен за любые идеи по отладке mod_rewrite, особенно за способы заглянуть в такие вещи, как %{HTTP_REFERER}, %1, $1 и тому подобное.

1 Ответ

0 голосов
/ 09 ноября 2011

Только что нашел решение, как (хотя бы частично) отладить mod_rewrite:

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

предоставляет очень удобный трюк для вывода некоторых значений, которые использует mod_rewrite.Я немного изменил пример, добавив следующее:

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 просто содержит

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

Вывод:

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

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

Что показываетчто мое первоначальное предположение было верным.

К сожалению, при применении второго условия отладчик больше не работает:

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]

выдает следующий вывод:

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

[p1] => 

Оказывается, что правила неожиданно сработали так, как предполагалось изначально.Проблема решилась сама собой.

Может быть, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...