#apache #mod-rewrite
#apache #mod-перезапись
Вопрос:
Я пытаюсь ограничить доступ к веб-странице с помощью mod_rewrite на основе referer. URL веб-страницыhttp://www.example.com/path/to/page.php Он расположен на сервере Debian в /var/www/path/to/page.php
у меня есть карта перезаписи allowedReferers
, содержащая список URL-адресов
allowedReferers
У меня также есть следующие условия / правила перезаписи
Переписать
Cond %{HTTP_REFERER} ^(.*)$
RewriteCond ${allowedReferers:%1|black} ^black$ [NC]
RewriteRule /* http://www.someotherplace.com [R,L]
Пока это работает отлично.
Может получить доступ к веб-сайту, в то время как
перенаправляется на someotherplace.com.
Моя проблема в том, что в реальной жизни мои рефереры будут содержать параметры GET. например
Моя идея заключалась в том, чтобы переписать первое условие на что-то вроде этого
RewriteCond %{HTTP_REFERER} ^(.*)?.*$
или это
RewriteCond %{HTTP_REFERER} ^(.*)?id=[0-9]*$
Я протестировал оба регулярных выражения в Firefox RegexTester, и они ведут себя так, как я хочу.
Применяется к следующему вводу
они возвращают это для $1
:
Я ожидал, что это %1
также содержит URL-адрес за вычетом параметров GET. Таким образом, оставляя остальную часть правила неизменной:
RewriteCond ${allowedReferers:%1|black} ^black$ [NC]
RewriteRule /* http://www.someotherplace.com [R,L]
должно привести к ожидаемому поведению:
может получить доступ к веб-сайту, в то время как
(или http://www.athirdplace.com / и т.д.)
будет перенаправлено на someotherplace.com
К сожалению, он ведет себя совсем не так, как ожидалось. После применения изменения к первому условию внезапно каждый реферер получает доступ к веб-сайту.
Поскольку я хотел посмотреть, что на самом деле находится внутри %1
, мне пришла в голову следующая идея:
RewriteCond %{HTTP_REFERER} ^(.*)?id=[0-9]*$
RewriteCond ${allowedReferers:%1|black} ^black$ [NC]
RewriteRule /* %1 [R,L]
Предполагая, что ссылка на страницу из
перенаправило бы меня на
Неверное предположение. Это перенаправляет меня на
который, как я упоминал в начале, является адресом страницы, доступ к которой должен быть ограничен. И, конечно, вызывает 404, как /var/www/
и docroot.
Перенаправление на %1
было просто отчаянной попыткой отладить мою проблему, поэтому мне не нужно решение для достижения этой цели. То, что я ищу, — это способ решить мою первоначальную проблему перенаправления. Рефереры, подобные этим
(независимо от того, какой идентификатор передается)
перейдите к
в то время как все остальное отправляется в
Наконец, я также был бы признателен за любые идеи по отладке mod_rewrite
, особенно способы заглянуть в такие вещи, как %{HTTP_REFERER}
, %1
, $1
и подобные.
Ответ №1:
Только что нашел решение, как (хотя бы частично) отладить 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}amp;p1=%1 [R=301,L,QSA]
mod_rewrite_debugger.php просто содержит
echo "amp;<preamp;>"; print_r($_GET); echo "amp;</preamp;>"
Результат таков:
[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}amp;p1=%1 [R=301,L,QSA]
выдает следующий вывод:
[referer] => http://vfh143.beuth-hochschule.de/tests/moodle3.php?id=3
[p1] =>
Оказывается, что правила внезапно сработали так, как изначально предполагалось. Проблема решилась сама собой.
Может быть, это кому-то поможет.