我工作的一家公司要求我使用他们的一个网站并将其设为另一个网站的子域。然后,他们要求我将“登录/注销”会话控制从他们的主域扩展到他们的子域。
完成此操作后,我发现存在控制/管理问题。由于它们有大量的单独页面,并且由于它们广泛的目录结构,它们太复杂了,无法将 PHP 片段添加到每个页面以根据登录状态进行重定向。
这是我的解决方案..请让我知道任何问题或任何其他对我有帮助的事情。
- 我将使用 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将解析request_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");
?>
我是如此接近,我可以品尝它。不幸的是,目前我几乎在所有地方都得到了“重定向循环”。如果有人可以在正确的方向上轻推我,我将不胜感激!