【问题标题】:Fix a redirect loop?修复重定向循环?
【发布时间】:2013-12-10 17:14:20
【问题描述】:

我的 index.php 页面中有以下代码:

 <?php include("/includes/widgets.php") ?>

在我的 widgets.php 页面中:

<?php
     header("Location: /");
?>

我想要实现的是在用户访问它时重定向它,但允许它包含。

但我收到以下错误:

网页有一个重定向循环

如何修复/防止重定向循环,但仍重定向用户而不是服务器。

【问题讨论】:

  • 如果您在索引页面中包含widgets.php,该页面将不断地重新加载。您需要删除包含或 header() 调用。
  • add 'header ('HTTP/1.1 301 Moved Permanently');'如果您要强迫那些曾经访问小部件页面的人回家,我会这么说。
  • 您可以添加某种停止重定向的变量。类似$alredy_redirected=true

标签: php redirect-loop


【解决方案1】:

将 widgets.php 文件放在 HTTP 客户端无法访问的文件夹中。即在 apache 网络服务器上,要么将它放在你的文档根目录之上(进入它的父级),要么使用 .htaccess 文件来阻止用户访问它。

例如

deny from all

【讨论】:

  • 我收回我的评论。很好地解决了他想要做的事情!
【解决方案2】:

我想我知道你需要什么:)

将代码索引文件更改为下一个

define("IS_INDEX", true);
include("/includes/widgets.php"

将 widgets.php 的代码更改为下一个

if (!defined("IS_INDEX")) {
    header("Location: /");
    exit();
}

【讨论】:

  • 我知道很多流行的 PHP 程序都是这样做的。可能只是因为它很容易。
【解决方案3】:

问题是您正在重定向回同一页面,然后再次重定向,一次又一次。

一个简单的解决方法是将重定向包装在 if 中,并且仅当它们不在索引页面上时才重定向;但这只是修补看起来像架构问题的问题。

类似:

if (ltrim($_SERVER['REQUEST_URI'], '/') != 'index.php')
    header('Location: index.php');

【讨论】:

    【解决方案4】:

    一种方法是检查加载的文件__FILE__是否与$_SERVER['REQUEST_URI'](或$_SERVER['PHP_SELF'])中请求的文件匹配。

    我在我们的开发站点上的一个页面中使用它,该页面通常包含在调试输出中。

    if(basename($_SERVER['PHP_SELF'])===basename(__FILE__)){
        //do some debugging
    }
    

    通常您不会使用 basename,但这是在面向非公开的开发站点上,并且该文件具有非常独特的名称,因此我不担心该文件包含在另一个具有相同名称的文件中或任何其他文件中.

    【讨论】:

      【解决方案5】:

      一种可能的方法是在重定向中添加一个参数,例如

      if (!$_REQUEST['redirect'])
          header("Location: /ìndex.php?redirect=1");
      

      这样重定向只能发生一次。

      如果用户已经在 / 上,另一种方法是停止重定向。我建议将两者结合起来。

      【讨论】:

        猜你喜欢
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多