Я пытаюсь ограничить доступ к веб-странице с помощью 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
и тому подобное.