【问题标题】:do I put the exit(); after each PHP header location or just after the last if statement?我把exit();在每个 PHP 标头位置之后还是在最后一个 if 语句之后?
【发布时间】:2014-11-25 19:24:18
【问题描述】:

正如标题所说,想知道我是否需要将exit(); 放在每个 PHP if 语句之后,或者只是主要的 if 语句或只是最后一个 if 语句?目前我在最后一个 if 语句中有它,它工作正常。

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {

    if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation == '' ) {
        header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
    }

    if ( $arr_position == '' ) {
        header ('Location: http://' . $domain . '/jobs/', true, 301);
    }

    if ( isset($home) && $arr_position == '' ) {
        header ('Location: http://' . $domain, true, 301);
    }

    if ( isset($home) && $arr_position != '' ) {
        header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);

        exit();
    }
}

更新

我将其更改为在每次标头位置调用后都有一个 exit() 并且一切仍然正常。这是在我的主模板文件中,所以是的,如果块头位置中没有任何匹配项,则下面的代码需要执行。

我现在是这样的

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {

    if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation != strtolower($arr_occupation) ) {
        header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
        exit();
    }

    if ( $arr_position == '' ) {
        header ('Location: http://' . $domain . '/jobs/', true, 301);
        exit();
    }

    if ( isset($home) && $arr_position == '' ) {
        header ('Location: http://' . $domain, true, 301);
        exit();
    }

    if ( isset($home) && $position == urlencode($arr_position) ) {
        header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
        exit();
    }
}

更新 2

我继续使用 DefiniteIntegral 答案,因为我喜欢这种逻辑,但我必须在主块中使用单独的 if 语句。使用elseif 不起作用。我已经对其进行了全面测试,并在每个elseif 中使用了不同的条件,但它无法正常工作。所以我可以在主块中使用单独的 if 语句。

这是现在的样子

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
    $new_url = false;

    if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation != strtolower($arr_occupation) ) {
        $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
    } 

    if ( $arr_position == '' ) {
        $new_url = 'http://' . $domain . '/jobs/';
    }

    if ( isset($home) && $arr_position == '' ) {
        $new_url = 'http://' . $domain;
    }

    if ( isset($home) && $arr_position != '' ) {
        $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
    }

    if ($new_url !== false) {
        header('Location: ' . $new_url, true, 301);
        exit();
    }
}

最终更新

终于让它与elseif 语句一起正常工作。必须在每个 elseif 代码块中的 if 语句中添加更多条件。

最终代码如下所示

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
    $new_url = false;

    if ( !isset($occupation) || $occupation != strtolower($arr_occupation) || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) ) {
        $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);

    } elseif ( isset($home) ) {
        if ( !isset($position) || $position != $arr_position || $position == '' ) {
            $new_url = 'http://' . $domain;
        } else {
            $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
        }

    } elseif ( $currentPage == 'Jobs' ) {
        if ( !isset($position) || $position == '' ) {
            $new_url = 'http://' . $domain . '/jobs/';
        } elseif (isset($position) && $position != '' && $position != $arr_position) {
            $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
        }
    }

    if ($new_url !== false) {
        header('Location: ' . $new_url, true, 301);
        exit();
    }
}

【问题讨论】:

    标签: php exit http-redirect


    【解决方案1】:

    如果您的目标是始终在此块中执行重定向,请将您的退出语句放在最后一个 if 块之后,大括号外。如果您向我们展示的块下方有代码,如果目标是重定向,它仍然会不必要地执行。

    if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
        $new_url = false;
    
        if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI']    != strtolower($_SERVER['REQUEST_URI']) || $occupation == '' ) {
            $new_url = 'http://' . $domain . strtolower ( '/ jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
        } elseif ( isset($home) ) {
            if ( $arr_position == '' ) {
                $new_url = 'http://' . $domain;
            } else {
                $new_url = 'http://' . $domain . strtolower ( '/ jobs/?occupation='.$arr_occupation.'&position='.$arr_position);    
            }
        } elseif ( $arr_position == '' ) {
            $new_url = 'http://' . $domain . '/jobs/';
        }
    
        if ($new_url !== false) {
            header('Location: ' . $new_url, true, 301);
            exit;
        }
    }
    

    【讨论】:

    • 我已经这样尝试过了,但是当 url 中有查询字符串时站点无法工作,因为这是主块中的第一个 if 条件。
    • 抱歉,不完全确定您要完成什么。如果您只是在条件匹配时尝试执行重定向,请参阅上面的编辑。
    • 好的,我喜欢你构建这个块的方式。但是当我在主块中使用elseif 而不是每个单独的if 编写它时,elseif 之一不会被触发。这个永远不会开火,即使在家里设置好时,它也总是在它上面的那个。 elseif ( isset($home) && $arr_position == '' )
    • 你能告诉我为什么会这样,关于我之前的评论吗?
    • 好的,实际上通过阅读条件,您需要更改结构以执行与前面的代码相同的操作。 if...elseif... 将评估通过的第一个条件,因此如果您可以正确地获得逻辑,这是一个更好的设计。上面再次更新。
    【解决方案2】:

    在每次header() 调用之后您的情况:您有 4 个不同的条件,可能没有或更多匹配,因此当您通过您的最后一个if 语句,导致您的页面在没有任何重定向的情况下退出。

    如果是一个 if 语句块,后跟 1 个或多个以 else 结尾的 elseif 语句,都包含重定向,则可以将其放在末尾:

    if
      header();
    elseif
      header();
    elseif
      header();
    else
      header();
    exit;
    

    但这将是唯一的情况,因为如果当前代码中没有一个 if 语句不匹配,您将需要某种错误处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多