summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2009-01-27 21:45:06 +0100
committerAndreas Gohr <andi@splitbrain.org>2009-01-27 21:45:06 +0100
commitaf2408d59bbe5e59c6c6b3a8125e6b512a887663 (patch)
tree1158561ea774a70b1b1038110bc03bec68e2338f
parenta64eec16d2d0bb6f36960279324ff4c67887bfbb (diff)
downloadrpg-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.php3
-rw-r--r--inc/common.php21
-rw-r--r--inc/media.php3
-rw-r--r--inc/pageutils.php2
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);