我有一个LAMP设置,我只是希望能够保护网页上的内容(图像,CSS,视频等),以便只有登录的用户才能访问它.
我意识到我可以使用.htaccess轻松完成这项工作.但是我不想使用身份验证弹出窗口,我希望能够使用会话并且还能够注销.
我正在使用php来完成使用mysql进行身份验证并创建会话.这非常有效.但仍然可以访问图像,CSS,JavaScript等.
仅当存在有效的php会话时,如何才允许访问内容?
我遇到过使用mod_rewrite将文件转发到php文件(比如auth.php?file = ...)并在那里进行会话检查.对于已经检查过的页面中的每个图像,检查会话似乎效率低下.这似乎是一个黑客,我一直认为有一个更清洁的方式来做到这一点.
是否有像mod_session_cookie这样的apache的mod可以检查我的会话数据库中是否存在具有会话密钥的cookie,如果是,则为目录设置Allow all?
或者,是否可以使用mod_auth_mysql,但也能够使用PHP表单而不是身份验证弹出窗口使用会话和登录?
编辑:
这是我解决问题的方法:
在我的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>
Run Code Online (Sandbox Code Playgroud)
脚本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 …Run Code Online (Sandbox Code Playgroud)