导致重定向循环的原因是什么?

时间:2010-11-23 19:35:42

标签: php web-applications redirect infinite-loop

以下是我的网页:

重定向页面: 如果用户具有打开的会话,则重定向到适当的资源 否则重定向到登录页面

登录页面: 如果用户登录信息有效,则重定向到$ _SERVER ['HTTP_REFERER'] 否则显示登录页面

当您访问重定向页面时,它会发现您没有有效的会话并重定向到登录页面。然后您可以登录没有问题,但在身份验证后我收到“此网页有一个重定向循环。” Chrome页面。

这不是一个真正的循环,因为有几种方法(IE提供有效的登录详细信息并转到目标资源,提供无效登录和接收错误消息等)。但是我可以看到浏览器的混乱(从a到b再到a)。

我有什么想法可以解决这个问题吗?

干杯

5 个答案:

答案 0 :(得分:5)

$ _ SERVER ['HTTP_REFERER']将始终是登录页面,因为您必须在成功登录之前加载登录页面。因此,一旦您成功登录,引荐来源就是登录页面,因此登录页面会将您重定向到您仍然成功登录的登录页面,因此它会一遍又一遍地登录您。

您可能应该在$ _SESSION或$ _COOKIE变量中存储他们试图访问的页面,而不是依赖于$ _SERVER ['HTTP_REFERER']。最有可能的会话会更好,具体取决于您的设置。

答案 1 :(得分:2)

提交登录详细信息后,$_SERVER['HTTP_REFERER']将成为您登录页面的URL,因为用户看到的最后一页是他们登录的表单。

在重定向到登录页面之前,请考虑在PHP会话中存储“重定向到”网址。您可以在重定向到登录页面时将其作为参数传递,但我可以看到该方法存在潜在的安全漏洞(例如将用户重定向到另一个站点,添加虚假的HTTP标头等)

答案 2 :(得分:1)

我的猜测是:

如果用户有会话但没有有效会话(例如:会话哈希不匹配),则会将其重定向到登录页面(因为他有会话)。但是当他到达那里时,你检查他是否有会话,并且他确实(但它无效),所以你将他重定向到索引资源。在那里,你检查会话是否有效,但事实并非如此。所以你将他重定向到登录页面。等等...

如何解决?检查登录页面和其他资源中的会话有效性(不仅仅是存在)。

当然,如果HTTP_REFERER是登录,请忽略它并转发到索引资源。

答案 3 :(得分:1)

您应该始终检查$ _SERVER ['HTTP_REFERER']变量是否包含有效数据,因为它不受信任,因为用户代理提供了此值。

来自the php.net manual

The address of the page (if any) which referred the user agent to the current page. This is set by the user agent. Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. In short, it cannot really be trusted. 

答案 4 :(得分:0)

您可以让您的登录页面一次性完成重定向(无需重定向回“重定向页面”)。