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
吗?
答案 0 :(得分:2)
我认为你的意思是切换需要break
,重点是,它不需要它,break
应该在条件之后需要时使用,在这种情况下,你已经按照exit
的方式做到了这一点,就好了。
答案 1 :(得分:2)
整个代码块在我看来毫无意义,你可以像这样得到完全相同的结果:
$protocol = empty($_GET['ssl']) ? 'http' : 'https';
header("Location: " . $protocol . "://site.com");
exit;
如果索引未定义为空或empty
,则函数0
将为true。
答案 2 :(得分:2)
由于我昨天仍然对整个交流感到不满,我想我会提供一个答案,并解释一些与break
和exit()
有关的事情。
正如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
将匹配第一个案例,然后运行每个案例,直到达到break
或return
。
关于return
,如果在循环中的函数中调用,它将结束函数执行,并且可能会引起混淆,如果在全局中调用,return()
也将结束当前脚本执行范围,但与exit()
不同(例如,对于include
'或require
'd文件,它不会影响主脚本。
exit()
(或die()
)与break
和return
的区别在于结束整个脚本的执行,而不仅仅是当前循环({{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();
}