【发布时间】:2012-09-14 11:01:49
【问题描述】:
我工作的一家公司要求我将他们的一个网站设为另一个网站的子域。然后,他们要求我将“登录/注销”会话控制从他们的主域扩展到他们的子域。
完成此操作后,我发现存在控制/管理问题。由于它们有大量的单独页面,并且由于它们广泛的目录结构,它们太复杂了,无法在每个页面中添加 PHP sn-p 以根据登录状态进行重定向。
这是我的解决方案。如果有任何问题或任何其他对我有帮助的事情,请告诉我。
- 我将使用 Mod_rewrite 将 subdomin 上的每个请求重定向到特定页面 (handler.php?requested_url=)。
-
我将在他们的网站上创建一个“网站允许/禁止规则”部分。本节将包含一个带有如下规则的文本框:
+/weather/ ---> will allow anyone access to any url that contains "/weather/" somewhere within it, irregardless of logged-in status. -/weather/premium/ ---> will only allow access to a url that contains /weather/premium to logged-in users.这将输出到一个存储在 rules.php 文件中的数组,该文件如下所示:
$ruleList = array(); $ruleList[] = '+/weather/'; $ruleList[] = '-/weather/premium/'; 在 handler.php 中,如果用户已登录,我会将他们转发到 requested.url。如果用户未登录,那么我将首先假设每个页面都仅限于未登录用户。 handler.php 将解析 requested_url 并对照 rules.php 检查它,看看是否有任何明确的权限设置。然后如果规则允许非登录访问,它会将用户转发到requested_url,否则将其发送到登录页面。
我可以立即看到的一个问题是,鉴于 Mod_rewrite 规则会将每个请求发送到 handler.php,我该如何避免无限循环?
是否应该通过header("Location: ")以外的其他方法进行重定向?
编辑:这是我的斗争的更新:
在我添加的顶级域 (example.com) 的 .htaccess 文件中:
#Prevent catching requests for the sub1 subdomain
RewriteCond %{REQUEST_URI} ^sub1\.example\.com
RewriteRule .* – [L]
然后,在 sub1.example.com 子域的 .htaccess 中,我添加了以下内容:
IndexIgnore *
RewriteEngine On
RewriteBase /path/to/base
#Avoid infinite loop on outgoing requests
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{HTTP_REFERER} !^/?handler.php?$
RewriteCond %{REQUEST_URI} !^/?handler.php?$
#Check for cookie. Redirect to handler if not found. (not yet implemented)
#RewriteCond %{HTTP_COOKIE} !session_id
RewriteRule (.*)$ handler.php?requested_url=$1 [NC,L,QSA]
这里是 handler.php
<?php
$url = $_REQUEST['requested_url'];
//Check list of permissions. For now just assume permitted.
$permitted = true;
if ($url == "") $url = "http://sub1.example.com";
if ($permitted)
header("Location: ".$url);
header("Location: http://sub1.example.com");
?>
我是如此接近,我可以品尝它。不幸的是,目前我几乎在所有地方都得到了“重定向循环”。如果有人可以在正确的方向上推动我,我将不胜感激!
【问题讨论】:
-
至于“每页加一个sn-p太累”,你考虑auto_prepend_file吗?
-
好吧,据我了解您的设置,如果登录页面被归类为受限访问,您应该只获得无限重定向循环,对吗?那么也许你的规则和 URL 解析部分做了一些意想不到的事情?
-
你可以用这个处理程序尝试一些棘手的反向代理。
标签: php session mod-rewrite redirect login