перенаправление на основе referer с использованием mod_rewrite, игнорирующее параметры GET

#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

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. например

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

Моя идея заключалась в том, чтобы переписать первое условие на что-то вроде этого

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

или это

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

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

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/ и docroot.

Перенаправление на %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:

Только что нашел решение, как (хотя бы частично) отладить 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] => 
  

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

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