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