У меня есть настройка LAMP, и я просто хочу иметь возможность защищать контент на веб-странице (изображения, CSS, видео и т. Д.), Чтобы к нему могли обращаться только зарегистрированные пользователи.
Я понимаю, что могу легко сделать это с помощью .htaccess. Однако я не хочу использовать всплывающее окно аутентификации, и я хочу иметь возможность использовать сеансы и выходить из системы.
Я использую php для аутентификации с помощью mysql и создания сессий. Это прекрасно работает. Но изображения, CSS, Javascript и т. Д. Все еще доступны.
Как мне разрешить доступ к контенту, только если существует действительный php-сеанс?
Я сталкивался с использованием mod_rewrite для пересылки файлов в php-файл (например, auth.php? File = ...) и выполнения там проверки сеанса. Это кажется неэффективным для проверки сеанса для каждого отдельного изображения на странице, которая уже была проверена. Это похоже на взлом, и я продолжаю думать, что есть более чистый способ сделать это.
Существует ли мод для apache, такой как mod_session_cookie, который мог бы проверять, существует ли в моей базе данных сеанс cookie с сеансовым ключом и, если да, устанавливает Allow from all для каталога?
В качестве альтернативы, возможно ли использовать mod_auth_mysql, но также можно использовать сеансы и вход в систему, используя форму php, а не всплывающее окно аутентификации?
EDIT:
Вот мое решение проблемы:
В моем конфигурационном файле apache (не .htaccess) я добавил:
RewriteLock /var/www/lib/rewrite.lock
<VirtualHost>
#...
RewriteEngine on
RewriteMap sessionValid prg:/var/www/lib/allow.php
<Directory /var/www/client/*>
RewriteEngine on
RewriteCond %{HTTP_COOKIE} !client-cookie=([^;]+)
RewriteRule .* - [L,R=403]
RewriteCond %{HTTP_COOKIE} client-cookie=([^;]+)
RewriteCond ${sessionValid:%1} !valid
RewriteRule .* - [L,R=403]
</Directory>
</VirtualHost>
И скрипт allow.php:
#!/usr/bin/php5
<?php
set_time_limit(0);
echo "";
$stdin = fopen("php://stdin","r");
$db = mysql_connect(...);
mysql_select_db(..., $db);
$querypre = "SELECT ID FROM Sessions WHERE ID='";
while (1) {
$line = trim(fgets($stdin));
$query = $querypre.mysql_real_escape_string($line)."'";
$result = mysql_query($query);
if (mysql_num_rows($result) > 0)
echo("valid\n");
else
echo("0\n");
}
mysql_close($db);
?>
Это работает как шарм. Используя это и session_set_save_handler Я смог использовать сеансы php, поддерживаемые mysql, для защиты как страниц php, так и всего содержимого внутри. Я надеюсь, что кто-то найдет это полезным.
Некоторые предостережения:
- Оператор RewriteMap должен быть определен внутри блока виртуального хоста, если вы собираетесь использовать его внутри этого виртуального хоста. Размещение его вне блока не будет работать.
- Вы должны включить RewriteEngine перед определением RewriteMap, иначе он будет проигнорирован.
- RewriteLock не может быть в блоке виртуального хоста.
- Как и в любом сценарии оболочки, файл php должен быть исполняемым пользователем apache и не должен содержать ^ M's
- Операторы RewriteMap нельзя поместить в .htaccess, но другие операторы, использующие карту, могут.