用于标头重定向的switch语句

时间:2011-04-10 01:06:25

标签: php

if (isset($_GET['ssl'])) {
    switch ($_GET['ssl']) {
        case 1:
            {
            header("Location: https://site.com");
            exit;
            }
        default:
            {
            header("Location: http://site.com");
            exit;
            }
    }
}

我应该使用exit;因为我正在使用标头吗?或者我应该像break要求那样使用switch吗?

5 个答案:

答案 0 :(得分:2)

我认为你的意思是切换需要break,重点是,它不需要它,break应该在条件之后需要时使用,在这种情况下,你已经按照exit的方式做到了这一点,就好了。

答案 1 :(得分:2)

整个代码块在我看来毫无意义,你可以像这样得到完全相同的结果:

$protocol = empty($_GET['ssl']) ? 'http' : 'https';
header("Location: " . $protocol . "://site.com");
exit;

如果索引未定义为空或empty,则函数0将为true。

答案 2 :(得分:2)

由于我昨天仍然对整个交流感到不满,我想我会提供一个答案,并解释一些与breakexit()有关的事情。

正如amosrivera指出的那样,在switch声明中不需要使用休息时间;它在其他循环结构中也是有效的。

来自manual

  

break结束当前的执行   for,foreach,while,do-while或   开关结构。

这意味着对于这些循环类型中的每一个,它将停止当前循环的执行,而不是执行调用脚本本身。另请注意:

  

break接受可选的数字   这个论点告诉它有多少   嵌套的封闭结构   打破了。

目的是停止执行循环;在开关中,它可以防止掉落。例如:

function mySwitch($var) {
    $return = '';

    switch ($var) {
        case 1:
            $return .= 'a';
        case 2:
            $return .= 'b';
            break;
        case 3:
            $return .= 'c';
    }

    return $return;
}

echo mySwitch(1); // outputs 'ab'
echo mySwitch(2); // outputs 'b'
echo mySwitch(3); // outputs 'c'

查看实时示例:http://codepad.org/8EMvYt7V

switch将匹配第一个案例,然后运行每个案例,直到达到breakreturn

关于return,如果在循环中的函数中调用,它将结束函数执行,并且可能会引起混淆,如果在全局中调用,return()也将结束当前脚本执行范围,但与exit()不同(例如,对于include'或require'd文件,它不会影响主脚本。

exit()(或die())与breakreturn的区别在于结束整个脚本的执行,而不仅仅是当前循环({{1} }),function(break)或script(return)。

现在,我碰巧同意coreyward,你可能不需要为此开关;我在一个可能不同的场景下使用不同的方法:

return()

可以改写为:

if (strtolower($_SERVER['HTTPS']) != 'on') {
    exit(header("location: https://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}"));
}

或者你可以创建一个需要ssl的动作/页面的查找列表,并在重定向中调用它:

if (strtolower($_SERVER['HTTPS']) != 'on' && $_GET['ssl']) {
    exit(header("location: https://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}"));
}

然后,您可以在需要强制执行重定向时调用此方法(并且您在URL中不需要function requireSSL($page) { $req = array('login.php','myaccount.php','updateaccount.php'); return in_array($page, $req); } function doSSLRedirect($page) { if (strtolower($_SERVER['HTTPS']) != 'on' && requireSSL($page)) { exit(header("location: https://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}")); } } ):

$_GET['ssl']

如果您使用某种MVC模式并检查URL中的操作,这将更方便;否则,你可以在脚本的头部使用doSSLRedirect($_SERVER['SCRIPT_NAME']);

由于我不知道您实际是如何实施SSL检查,因此这些只是建议。查看上面的代码,如果只是插入页面顶部,如果您无意中将ssl变量添加回重定向的URL,则最终可能会出现无限循环。

就调用include checkssl.php(或exit())而言,您不必将两者配对,但它们通常同时发生或彼此接近发生,因为随后的任何输出不应该被用户的浏览器看到。

例如,如果您将它们分开,您可以创建一个重定向检查,以防您在退出之前有其他想要发生的事情(可能是某些日志记录或其他内容)。

例如:

die()

但是,在这种情况下,您可以轻松地将其放入$sslredirected = false; if (isset($_GET['ssl'])) { switch ($_GET['ssl']) { case 1: header("Location: https://site.com"); $sslredirected = true; default: header("Location: http://site.com"); $sslredirected = false; } } if ($sslredirected === true) { $otherstuff = youNeedToDoBeforeRedirection(); exit; } '文件中,然后在include中调用该文件,然后让它进行switch调用。这可以采用多种不同的方式。

关于使用exit()的另一个注意事项,您需要在输出任何内容之前调用它(包括空格)。有关我的意思,请参阅http://codepad.org/nJ4aght4。请注意,在这种情况下,不会发送标头,因此不会发生重定向。

希望这会有所帮助。 :)

答案 3 :(得分:1)

如果需要,请在结尾处使用exit:

   if (isset($_GET['ssl'])) {
        switch ($_GET['ssl']) {
            case 1:
                {
                header("Location: https://site.com");
                break;
                }
                default:
                {
                  header("Location: http://site.com");

                }
        }
    }
    exit;

答案 4 :(得分:0)

switch在这里并不合适 - 它使事情变得更复杂,而不是更少。

if (isset($_GET['ssl']) {
  header('Location: ' . ($_GET['ssl'] ? 'https' : 'http') . '://example.com/');
  exit();
}