From 9a87c72a533121b83c56075947a3e27c853b2188 Mon Sep 17 00:00:00 2001 From: Andreas Gohr <andi@splitbrain.org> Date: Mon, 8 Oct 2007 20:50:19 +0200 Subject: [PATCH] X-Sendfile support for fetch.php This patch enables the use of the X-Sendfile extension offered by certain webservers to deliver static files after running a dynamic script. This combines the flexibility of a PHP file to check for authorization, caching and resizing with the low memory footprint and high performance of static file delivery of the webserver. See http://blog.lighttpd.net/articles/2006/07/02/x-sendfile for details darcs-hash:20071008185019-7ad00-1e6d4768fb60d58955e4253c7786eaf8cf13d0bb.gz --- conf/dokuwiki.php | 1 + lib/exe/fetch.php | 16 ++++++++++++++-- lib/plugins/config/lang/en/lang.php | 5 +++++ lib/plugins/config/settings/config.metadata.php | 1 + 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php index c041d0bee..bd92f4730 100644 --- a/conf/dokuwiki.php +++ b/conf/dokuwiki.php @@ -118,6 +118,7 @@ $conf['rss_update'] = 5*60; //Update the RSS feed every n minutes ( $conf['recent_days'] = 7; //How many days of recent changes to keep. (days) $conf['rss_show_summary'] = 1; //Add revision summary to title? 0|1 $conf['broken_iua'] = 0; //Platform with broken ignore_user_abort (IIS+CGI) 0|1 +$conf['xsendfile'] = 0; //Use X-Sendfile (1 = lighttpd, 2 = standard) //Set target to use when creating links - leave empty for same window $conf['target']['wiki'] = ''; diff --git a/lib/exe/fetch.php b/lib/exe/fetch.php index 71ec2870b..d29ed9f64 100644 --- a/lib/exe/fetch.php +++ b/lib/exe/fetch.php @@ -104,16 +104,28 @@ function sendFile($file,$mime,$cache){ header('Cache-Control: must-revalidate, no-transform, post-check=0, pre-check=0'); header('Pragma: public'); } - header('Accept-Ranges: bytes'); //send important headers first, script stops here if '304 Not Modified' response http_conditionalRequest($fmtime); - list($start,$len) = http_rangeRequest(filesize($file)); + //application mime type is downloadable if(substr($mime,0,11) == 'application'){ header('Content-Disposition: attachment; filename="'.basename($file).'";'); } + //use x-sendfile header to pass the delivery to compatible webservers + if($conf['xsendfile'] == 1){ + header("X-LIGHTTPD-send-file: $file"); + exit; + }elseif($conf['xsendfile'] == 2){ + header("X-Sendfile: $file"); + exit; + } + + //support download continueing + header('Accept-Ranges: bytes'); + list($start,$len) = http_rangeRequest(filesize($file)); + // send file contents $fp = @fopen($file,"rb"); if($fp){ diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php index e0b9a95af..639c138f3 100644 --- a/lib/plugins/config/lang/en/lang.php +++ b/lib/plugins/config/lang/en/lang.php @@ -125,6 +125,7 @@ $lang['hidepages'] = 'Hide matching pages (regular expressions)'; $lang['send404'] = 'Send "HTTP 404/Page Not Found" for non existing pages'; $lang['sitemap'] = 'Generate Google sitemap (days)'; $lang['broken_iua'] = 'Is the ignore_user_abort function broken on your system? This could cause a non working search index. IIS+PHP/CGI is known to be broken. See <a href="http://bugs.splitbrain.org/?do=details&task_id=852">Bug 852</a> for more info.'; +$lang['xsendfile'] = 'Use the X-Sendfile header to let the webserver deliver static files? Your webserver needs to support this.'; $lang['rss_type'] = 'XML feed type'; $lang['rss_linkto'] = 'XML feed links to'; @@ -199,3 +200,7 @@ $lang['compression_o_0'] = 'none'; $lang['compression_o_gz'] = 'gzip'; $lang['compression_o_bz2'] = 'bz2'; +/* xsendfile header */ +$lang['xsendfile_o_0'] = "don't use"; +$lang['xsendfile_o_1'] = 'Propritary lighttpd header (before release 1.5)'; +$lang['xsendfile_o_2'] = 'Standard X-Sendfile header'; diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php index 3609b0cf5..1f886737d 100644 --- a/lib/plugins/config/settings/config.metadata.php +++ b/lib/plugins/config/settings/config.metadata.php @@ -172,6 +172,7 @@ $meta['rss_update'] = array('numeric'); $meta['recent_days'] = array('numeric'); $meta['rss_show_summary'] = array('onoff'); $meta['broken_iua'] = array('onoff'); +$meta['xsendfile'] = array('multichoice','_choices' => array(0,1,2)); $meta['_network'] = array('fieldset'); $meta['proxy____host'] = array('string','_pattern' => '#^(|[a-z0-9\-\.+]+)$#i'); -- GitLab