diff options
author | Andreas Gohr <andi@splitbrain.org> | 2009-01-27 21:45:06 +0100 |
---|---|---|
committer | Andreas Gohr <andi@splitbrain.org> | 2009-01-27 21:45:06 +0100 |
commit | af2408d59bbe5e59c6c6b3a8125e6b512a887663 (patch) | |
tree | 1158561ea774a70b1b1038110bc03bec68e2338f | |
parent | a64eec16d2d0bb6f36960279324ff4c67887bfbb (diff) | |
download | rpg-af2408d59bbe5e59c6c6b3a8125e6b512a887663.tar.gz rpg-af2408d59bbe5e59c6c6b3a8125e6b512a887663.tar.bz2 |
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
-rw-r--r-- | inc/actions.php | 3 | ||||
-rw-r--r-- | inc/common.php | 21 | ||||
-rw-r--r-- | inc/media.php | 3 | ||||
-rw-r--r-- | 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); |