header + mod_rewrite = зацикливание

nerd

Новичок
header + mod_rewrite = зацикливание

Проблема состоит в следующем. Мне нужно сделать так, чтобы при попытке взять site.ru/1.mp3 незарегистрированные пользователи попадали на login.php, а зарегистрированные соответственно получали 1.mp3.

В качестве решения я решил прогонять все запросы на *.mp3 через скрипт (gate.php). Для этого я в httpd.conf прописываю следующее:
RewriteCond %{HTTP_REFERER} !^.*gate\.php.*$
RewriteRule /(.*)\.mp3 /gate.php?id=$1 [R,L]

gate.php выглядит примерно так:
PHP:
if ($_SESSION['user']!=''){
		header('Location: http://site.ru/'.$_GET['id'].'.mp3');
                exit;
	}
	else {
		header('Location: http://site.ru/login.php');
                exit;
	}
Проблема в том, что RewriteCond %{HTTP_REFERER} !^.*gate\.php.*$ не отлавливает запросы на mp3 уже прошедшие через gate.php, так как при использовании header('Location..) в HTTP_REFERER не прописывается gate.php, как место откуда пришли за mp3, там остается та страница, с которой попали на gate.php. В результате это дело зацикливается.

Не вижу смысла расписывать тут все методы и варианты, которые я испробовал, я надеюсь, что кто-нибудь предложить заведомо работающее решение такой проблемы. Сразу оговорюсь, что меня интересует именно решение с "прогонянием" запросов на mp3 через скрипт, варианты решения задачи через .htaccess и файл паролей, либо через php fopen() не катят ввиду ущербности.
:p
 

Sam

Новичок
не понял в чём ущербность решения через .htaccess
насчёт зацикливания - добавь в хедере какую-то строку и потом в RewriteCond её ищи.

и не забудь проверять $_GET['id']
 

nerd

Новичок
В общем вопрос стоит именно так, через что можно передать вместе с запросом данные, которые потом отлавливались бы RewriteCond? Значения переменных окружения сбрасываются похоже. HTTP-заголовки неясно какие можно для этого использовать - пробовал в extension-header записывать строку, но RewriteCond %{HTTP:extension-header} его не видит почему-то.

Народ, ну подскажите что-нибудь! :)

Если делать через .htaccess, то сразу выходит что apache во-первых будет при каждом запросе открывать файлы (сам .htacces, потом файл паролей - ведь насколько я знаю "научить" .htaccess ходить за паролями в mysql нельзя :)), кроме того мне удобно при каждом обращении на загрузку mp3 делать скриптом определенные действия. Короче очень хочется проводить запросы на mp3 через скрипт!!!

На насчет проверки $_GET['id'] - ведь по идее даже если его не проверять и злобный хацкер подставит там левый путь какой-то, то это приведет лишь к том что файл будет не найден и все. Или я что-то недопонимаю?
 

Sam

Новичок
при чём здесь файл паролей?
посмотри здесь
http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html#rewriterule
http://community.livejournal.com/ru_mod_rewrite/

и в гугл по mod_rewrite

по поыоду переменных окружения - при location ты прибьёшь $_POST, а гетом можно всё передать

насчёт $_GET['id'] - недопонимаешь. в гугл XSS и т.д
 

nerd

Новичок
За ссылки спасибо, конечно, но я их уже давно проштудировал, не первый день разбираюсь с этой темой :). Ну файл паролей используют, чтобы доступ дать к определенным файлам только определенным пользователям - по крайней мере я видел такое решение.

Насчет передачи ГЕТОМ не понял, как? (location ведь на mp3 файл перенаправляет, а не на скрипт) Если можно по-подробнее, чтобы я хоть идею уловил. Мне по идее нужно какое-то место, куда можно записать данные, которые были бы доступны в RewriteCond, когда он будет "решать" перенаправлять mp3 или не перенаправлять.

По поводу XSS спасибо большое. Действительно есть уезвимость и я о ней не знал!


Короче я вот думаю попробовать сделать так. Скажем, есть скрипт отображения каталога музыкальных файлов: site.ru/works.php. Этот скрипт смотрит авторизованн пользователь или нет, если да - выдает ему ссылки на mp3, если нет - вместо ссылок на mp3 ссылки на login.php. Mod_rewrite же все ссылки на mp3 перенаправляет на логин, КРОМЕ тех ссылок у которых HTTP_REFERER - site.ru/works.php (тоесть тех, которые пользователь получил от works.php, который конечно же выдасть их только авторизованному пользователю). Вот примерно такая идея, вроде более менее...
 

Sam

Новичок
ниасилил я твою идею, точнее осилил, но не до конца. по-моему ты переусложняешь.

чтобы выдать клиенту файл совершенно не обязательно переправлять его location'ом на этот файл.

почитай про
header Content-type
header Content-Disposition

думаю так всё это реализуется проще.
 
Сверху