#wordpress #.htaccess #directory
#wordpress #.htaccess #каталог
Вопрос:
У меня есть сайт WordPress, который скрывает определенные ссылки в своем сообщении для незарегистрированных пользователей. Ссылки ведут в папку, хранящуюся на сервере (ничего общего с wp-uploads, все загружено вручную). Например —
http://domain.com/courses/course-one/index.html
Я хотел бы защитить http://domain.com/courses папка, чтобы любой, кто вводит или вставляет ссылку напрямую, или приходит с другого сайта, не имел доступа к файлам внутри.
Возможно ли разрешить доступ только пользователям, которые в данный момент вошли на сайт? Или, может быть, ссылка работает, только если перейти с самих страниц сайта?
Комментарии:
1. Взгляните на эту статью: willmaster.com/blog/contentprotection/htaccess-cookie.php
2. Это большое спасибо. Я могу установить свой собственный cookie для зарегистрированных пользователей и протестировать его в htaccess. Попал в точку!
Ответ №1:
Я могу придумать два способа сделать это
Использование файлов cookie
Как и предлагали funkysouls, мы можем создать файл .htaccess, чтобы проверить, авторизован ли пользователь. Например:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} ^.*(mp3|m4a|jpeg|jpg|gif|png|bmp|pdf|doc|docx|ppt|pptx|)$
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]
RewriteRule . - [R=403,L]
Этот файл .htaccess просто проверяет, есть ли у пользователя файл cookie с именем «wordpress_logged_in». Если нет файла cookie «wordpress_logged_in», то отображается страница, содержащая 403 записи.
Проблема с этим подходом заключается в том, что файлы cookie могут быть созданы и изменены клиентом. Другими словами, пользователь может просто открыть хранилище браузера, создать cookie с этим именем и получить доступ к вашим защищенным файлам без входа в WordPress.
Использование PHP-скрипта
Другим решением является использование файла .htaccess для «перенаправления» на php-скрипт. Например:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} ^.*(mp3|m4a|jpeg|jpg|gif|png|bmp|pdf|doc|docx|ppt|pptx|)$
RewriteRule . http://<HOST>/<YOUR-PHP-FILE>.php?file=%{REQUEST_FILENAME}
Обратите внимание, что мы передаем имя файла ( REQUEST_FILENAME
) нашему php-файлу через параметры запроса.
В файле php вы можете проверить наличие пользовательских разрешений и предоставить файл пользователю:
<?php
define( 'WP_USE_THEMES', false );
# load wordpress functions. We need that to retrive loged user information
include('../../wp-load.php');
# get filename from query params
$filename = $_GET['file'];
# check if user is loged in
global $current_user;
get_currentuserinfo();
$can_access = ($user_level > 1);
# You could also check if the user is an adm
# $is_adm = current_user_can('administrator');
# Clean buffer management (prevent erros at file "generation")
while (ob_get_level()) {
ob_end_clean();
}
if ($can_access){
header('Content-Type: '.mime_content_type($filename));
$read = readfile($filename);
if (!$read){
echo "error while loading the file";
}
}else{
echo "you can not access this file";
}
?>
Комментарии:
1. Привет, @giusti. Я отредактировал свой ответ, чтобы он меньше походил на другой вопрос.
2. Привет, @Anny. Возможно, я допустил ошибку. Спасибо, что дали мне знать.