Добрый день!
Подскажите пожалуйста, как ограничить доступ к файлам вида: http://test.ru/sites/default/files/pdf/test.pdf при обращении через адресную строку. Но разрешить доступ к этим же файлам, при обращении к ним через src в iframe.
В моем случае используется модуль PDF для отображения на сайте. Но если папке поставить ограничения на выполнение для всех через атрибуты chmod, то файл и в iframe - не отображается.
Подскажите пожалуйста, что можно сделать. Версия Drupal 6.
Кстати в разрешениях просмотр содержимого поля стоит только для авторизованного пользователя, но это ограничение не помогает.
Комментарии
настраиваем сервер так, чтоб при обращении к этим файлам он отправлялся к друпалу, в друпе создаем колбек для меню с этим адресом через который и отдаем файлы предварительно проводя проверки доступа.
подскажите пожалуйста как настроить сервер, можно в файле .htaccess? Но что надо прописать?
sg85, спасибо!
Подскажите пожалуйста, как надо настроить сервер?
Еще предложили решение, чтобы в iframe прописывать путь до php файла, в котором будет проверка на доступ к файлу и потом его уже инклудить.
через php файл можно, но я бы так делать не стал.
через .htaccess можно, один из наиболее удобных вариантов создать реврайт правило на php файл(если уж решили им) или просто на путь объявленный в Вашем модуле. К сожалению апач не помню, так что сами правила подсказать не смогу, в документацию лезть лень.
пишу правило для .htaccess:
RewriteEngine On
RewriteRule .(pdf)$ /sites/all/modules/pdf/pdf.module
Я наверное не правильно указываю путь до модуля? как правильно настроить чтобы правило друпала, прописанное в функции hook_menu срабатывало?
Причем тут модуль? допустим, у Вас картинки как положено складываются в "sites/default/files/some_images/*", при этом в модуле задаете адрес, например, "mymodule/%", необходимо чтобы при обращении к sites/default/files/some_images/* редирект шел в mymodule/*. Подобный подход не должен возыметь каких либо неприятных последствий.
function pdf_menu() {
$items = array();
$items['pdf_access'] = array(
'page callback' => 'pdf_access_view',
'access callback' => TRUE,
'access arguments' => array('pdf_access_view'),
'type' => MENU_CALLBACK
);
return $items;
}
function pdf_access_view() {
$fil=$_SESSION['file_url'];
return($fil);
}
????
А не будет зацикленности? посмотрите пожалуйста правильность вызова и return.
Как должен выглядеть callback в моем случае?
Для 7рки как-то так:
//$filename - это аргумент из адресной строки, в данном случае передается как аргумент из hook_menu
//$filepath - как не сложно догадаться, содержит в себе полный путь к реальному файлу
$filepath = drupal_realpath('public://some_images/').$filename;
if(!file_exists($filepath)) return MENU_NOT_FOUND;
drupal_add_http_header('Content-Type', 'image/jpeg');
$fp = fopen($filepath, 'rb');
while (!feof($fp)) {
print fread($fp, 1024);
}
fclose($fp);
drupal_exit();
}
Самое главное, на что следует обратить внимание, это то, что проверка доступа будет проводиться в hook_menu.
А вот под 6рку не писал уже довольно давно, но принцип остается тем же.(и да, 6рка не понимает public://, к сожалению не помню, каким образом получить в 6рке путь к sites/default/files). Если 6рка не умеет в hook_menu передавать аргументы в колбек(не помню этот момент), то для получения аргумента можно воспользоваться функцией arg().
И да, выдача картинок через PHP довольно тяжелый процесс для сервера(о чем собственно предупреждает 7рка, которая эту хрень уже некоторым образом поддерживает)
тогда уж
return array(
'pdfaccess/%' => array(
'type' => MENU_CALLBACK,
'page callback' => 'some_callback',
'page arguments' => array(1),
'access arguments' => array('pdf_access_view'),
'access callback' => 'user_access',//в 6рке не устанавливается по умолчанию? не помню. в 7рке эта строчка не нужна
),
);
}
В примере колбека измените content type, меня что-то переклинило, что Вам нужно отдавать jpeg