我在apache(2.4)Web服务器上编写了一个Web应用程序,用户通过kerberos进行身份验证。我的数据库中有一个用户表,基本权限(r,w)设置为0或1.现在,我想在每次用户尝试访问此Web服务器上的页面时检查这些权限。当用户没有读取权限时,应将其重定向到“forbidden.html”页面。显然,apache无法进行权限检查。所以我用php试了一下。
到目前为止我有什么
我已将所有html文件放在apache DocumentRoot中的子文件夹/ html中,并将其放入我的配置文件中,以便每当用户在/ html中请求页面时调用php / auth.php:
<Location /html>
<If "%{REQUEST_URI} !~ m#\/forbidden\.html#">
# Script checks if user should get access to the site
SetHandler auth-script
Action auth-script "/php/auth.php"
</If>
</Location>
的PHP / auth.php:
if ($params["user"]["r"] == 1) {
// User has permission, redirect to the requested page
header("Location: https://webapp.domain.de".$_SERVER["REQUEST_URI"]);
} else {
// User has no permission, redirect to forbidden.html
header("Location: https://webapp.domain.de/html/forbidden.html");
}
问题
我的问题是我得到了一个重定向循环。似乎来自auth.php的header()的重定向再次通过apache的Action指令触发auth.php脚本。当用户重定向到forbidden.html时,不会出现此行为,因为它已在conf文件中排除。
我尝试在auth.php中注释掉header(),但apache不会使用Action指令自动为所请求的站点提供服务。
有没有办法知道auth.php是否已经在此请求中重定向用户并告诉apache不调用脚本。或者有更好的方法来实现我想要实现的目标吗?
提前致谢。
答案 0 :(得分:1)
我做了类似的事情,根本没有使用Apache指令(托管网站,不能改变任何东西)。您不需要Apache重定向部分。
在每个phtml文件中,我所做的第一个操作是要求一个类似于你的auth.php的PHP页面。如果auth.php检测到用户没有该页面的权限,我会发回一个标题来重定向他,如下所示:
header('Location: http://www.example.com/forbidden.html');
只需确保在调用标题之前没有打印任何其他内容,并且未经授权的用户将在您的位置页面中结束。
如果用户已获得授权,没有标题,没有重定向,请继续&#34;向下&#34;页面。