【问题标题】:Error TOO MANY REDIRECTS debbuged错误太多重定向调试
【发布时间】:2016-11-01 21:34:14
【问题描述】:

我花了几个小时试图解决这个ERR_TOO_MANY_REDIRECTS,但没有成功。

当我在未登录的情况下访问我的网站 URL 时会发生这种情况。因此,如果我没有启动会话,我将被重定向到 -> mywebsite.com/site/login 或只是 /login

下面的 PHP 代码:

if ( isset($_GET['p2k_url']) && $_GET['p2k_url'] ) {

        if ( strstr($_GET['p2k_url'], '/') ) {

            $url = explode('/', $_GET['p2k_url']);

        } else {
            $url[0] = $_GET['p2k_url'];
        }

        if ( !isset($url[1]) || !$url[1] ) {
            $url[1] = 'index';
        }
    }

    if ( $url[0] != 'login' && !$__usuCod ) {
        header('Location: /site/login.php');
        die();
    }

    if ( file_exists(SITE_DIR.DS.'_'.$url[0].DS.$url[1].'.php') ) {

        include SITE_DIR.DS.'_'.$url[0].DS.$url[1].'.php';

    } else {

        if ( file_exists(SITE_DIR.DS.'_'.$url[0].DS.'no404.php') ) {
            include SITE_DIR.DS.'_'.$url[0].DS.'index.php';
        } else {
            include SITE_DIR.DS.'_404'.DS.'index.php';
        }
    }

就在这里:if ( $url[0] != 'login' && !$__usuCod ) {

我的 login.php 只是一个带有表单的简单 html 页面。没什么好担心的。

虽然我的主要 .htaccess 在下面,但我认为它可能有一些东西:

选项-索引

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^(.*)$ index.php?p2k_url=$1 [QSA,L]
</IfModule>

为了调试和查找错误,当我运行 tail -f access_log 时,我得到的只是简单的访问请求:

127.0.0.1 - - [01/Nov/2016:11:16:28 -0200] "GET /site/login.php HTTP/1.1" 302 -

error_log 不会出现任何问题。

做研究我发现这是 WP 的一个非常常见的问题 - 这里不是这种情况。有什么想法吗?

谢谢

【问题讨论】:

  • if ( isset($_GET['p2k_url']) &amp;&amp; isset($_GET['p2k_url']) ) {if ( strstr($_GET['p2k_url'], '/') ) {$url = explode('/', $_GET['p2k_url']);} else {$url[0] = $_GET['p2k_url'];}if ( !isset($url[1])) {$url[1] = 'index';}} if ( $url[0] !== 'login' &amp;&amp; !$__usuCod ) {header('Location: /site/login.php');die();} if ( file_exists(SITE_DIR.DS.'_'.$url[0].DS.$url[1].'.php') ) {include SITE_DIR.DS.'_'.$url[0].DS.$url[1].'.php';} else {if ( file_exists(SITE_DIR.DS.'_'.$url[0].DS.'no404.php') ) {include SITE_DIR.DS.'_'.$url[0].DS.'index.php';} else {include SITE_DIR.DS.'_404'.DS.'index.php';}}
  • 只需将RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-f 添加到您的htaccess 文件中。
  • @Federkun 我已经这样做了,但没有任何改变......

标签: php apache


【解决方案1】:

所以你重定向到/site/login.php,你的重写更改为index.php?p2k_url=site/login.php

$url 将是 ['site', 'login.php'] 的数组(我会在爆炸之前确定 trim($x, '/') 字符串)。

然后您测试$url[0] != 'login' 是否始终为真,因为[0]site。您需要先测试是否$url[1] != 'login.php' 或从字符串中修剪文件扩展名。

如果你想允许/site/login/login,那么你只需要为此制定一个规则。如果/site/xxx 始终等于/xxx,那么如果$url[0] == 'site' (或正确规范你的url),只需从$url 中删除第一个数组索引

我早期使用的一个非常有用的调试技术是var_dumpprint_r 以及die()exit。使用die('xxx') 之类的东西并在脚本中上下移动它以识别重定向发生的位置,然后打印出变量以查看它们包含的内容并检查您是否正确比较它们。这是一种粗略的方法,但它有效

【讨论】:

  • 是的,我通常也使用 dump 或 print_r 进行调试,但在这种情况下,它并没有带来我需要的东西。顺便说一句 print_r($url) 是数组( [0] => login.php [1] => index )
  • $_GET['p2k_url'] 在你爆炸之前的值是多少,因为如果 URL 与您的问题中所述的一样,我无法看到indexlogin 之后的位置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 2016-01-18
  • 2012-06-30
相关资源
最近更新 更多