From af2408d59bbe5e59c6c6b3a8125e6b512a887663 Mon Sep 17 00:00:00 2001 From: Andreas Gohr <andi@splitbrain.org> Date: Tue, 27 Jan 2009 21:45:06 +0100 Subject: [PATCH] Work around IIS bug for redirects FS#1576 Ignore-this: 37b33f575e4c0b31e4af93185bf74f0f When IIS is running PHP in CGI mode it will not send cookie headers on 302 redirections. This is a known bug (KB176113). This patch will detect affected servers. Instead of a 302 redirect a Refresh: header is issued. This is supported by all known browsers should have the same effect as a real redirect. darcs-hash:20090127204506-7ad00-ce474f3b0db003e86e09d5e9a9bd7c96887ac01c.gz --- inc/actions.php | 3 +-- inc/common.php | 21 +++++++++++++++++++++ inc/media.php | 3 +-- inc/pageutils.php | 2 +- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/inc/actions.php b/inc/actions.php index bebdeefce..6d7859b6a 100644 --- a/inc/actions.php +++ b/inc/actions.php @@ -357,8 +357,7 @@ function act_redirect_execute($opts){ if($opts['fragment']) $go .= '#'.$opts['fragment']; //show it - header("Location: $go"); - exit(); + send_redirect($go); } /** diff --git a/inc/common.php b/inc/common.php index 606f107b7..817e416b0 100644 --- a/inc/common.php +++ b/inc/common.php @@ -1454,4 +1454,25 @@ function is_mem_available($mem,$bytes=1048576){ return true; } +/** + * Send a HTTP redirect to the browser + * + * Works arround Microsoft IIS cookie sending bug. Exits the script. + * + * @link http://support.microsoft.com/kb/q176113/ + * @author Andreas Gohr <andi@splitbrain.org> + */ +function send_redirect($url){ + // check if running on IIS < 6 with CGI-PHP + if( isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['GATEWAY_INTERFACE']) && + (strpos($_SERVER['GATEWAY_INTERFACE'],'CGI') !== false) && + (preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($_SERVER['SERVER_SOFTWARE']), $matches)) && + $matches[1] < 6 ){ + header('Refresh: 0;url='.$url); + }else{ + header('Location: '.$url); + } + exit; +} + //Setup VIM: ex: et ts=2 enc=utf-8 : diff --git a/inc/media.php b/inc/media.php index 37f73208c..c932a07d4 100644 --- a/inc/media.php +++ b/inc/media.php @@ -201,9 +201,8 @@ function media_delete($id,$auth){ if($data['unl'] && $data['del']){ // current namespace was removed. redirecting to root ns passing msg along - header('Location: '.DOKU_URL.'lib/exe/mediamanager.php?msg1='. + send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='. rawurlencode(sprintf(noNS($id),$lang['deletesucc']))); - exit; } return $data['unl']; diff --git a/inc/pageutils.php b/inc/pageutils.php index 4a62244dc..d3d9478ca 100644 --- a/inc/pageutils.php +++ b/inc/pageutils.php @@ -68,7 +68,7 @@ function getID($param='id',$clean=true){ // fall back to default $id = $id.$conf['start']; } - header("Location: ".wl($id,'',true)); + send_redirect("Location: ".wl($id,'',true)); } if($clean) $id = cleanID($id); -- GitLab