X-accel-redirect serving html download page instead of file.

wideawake nginx-forum at nginx.us
Tue Aug 28 01:29:47 UTC 2012


I have a script that uses x-accel-redirect on a nginx server to send large
files (150mb+). The script serves downloads fine as long as their is a space
in the name of the directory but not when the directory is a single word.
Anyone know why it would be doing so when the file exists and the path is
correct?

Layout: /Dir/file.exe /Dir2/file.exe /Another Dir/file.exe

If it's /Another Dir/file.exe it serves the file perfectly, however if its
/Dir/file.exe it serves the html of the download page. Anyone seen this
before?

nginx config:
server {
  access_log  logs/access_log;
  access_log  on;
  limit_conn  gulag 3;
  error_log  /var/log/nginx/vhost-error_log crit;
  listen    80 default;
  server_name  www.my.com my.com;
  root   /home/mysite/public_html;
  #root /usr/share/nginx/html;
  autoindex off;
  index  index.php index.html index.htm;

  
  
  #rewrite ^.*/([-\w\.]+)/([-\w\.]+)\.zip$
/download.php?model=$1&file=$2.zip last;
  #rewrite ^.*/([-\w\.]+)/([-\w\.]+)\.exe$
/download.php?model=$1&file=$2.exe last;
  #rewrite ^.*/([-\w\.]+)/([-\w\.]+)\.nbh$
/download.php?model=$1&file=$2.nbh last;
  #rewrite ^.*/([-\w\.]+)/([-\w\.]+)\.rar$
/download.php?model=$1&file=$2.rar last;

  error_page 503 /503.html;
	location = /503.html {
	root /home/mysite/public_html/errors;
	}
 

  error_page 504 /504.html;
	location = /504.html {
	root /home/mysite/public_html/errors;
	}
	

  # pass the PHP scripts to FastCGI server
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:8888;
	     #fastcgi_pass    unix:/var/run/nginx-fcgi.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME 
/home/mysite/public_html$fastcgi_script_name;
            include        /etc/nginx/fastcgi_params;

	     fastcgi_intercept_errors off;
        }
		
			
 }

php code:
<?php
/*File Download Script*/ 
$fileserver_path = "./shipped/";	// change this to the directory your files
reside
$fileurlpath = "http://my.com/shipped/";
$req_file 		 = basename($_GET['file']);
$model			 = $_GET['model'];
$thisfile			 = basename(__FILE__); 
$msg="";
$error=FALSE;

$path = $model."/".$req_file;


if (empty($req_file)) {
	$error=TRUE;
	$msg .= "Usage: $thisfile?model=<model
name>&file=<file_to_download><br />";
}

if (! isset($_GET["model"])) {
	$error=TRUE;
	$msg .= "No Model information present. Unable to continue.<br />";
} else {
	$fileserver_path .= $model."/";
	$fileurlpath .= $model."/";
	/* check if file exists */
	if (!file_exists($fileserver_path.$req_file)) {
		$error=TRUE;
		$msg .= "$req_file doesn't exist.";
	}
}

/* no web spamming */
if (!preg_match("/^[a-zA-Z0-9._-]+$/", $req_file, $matches)) {
	$error=TRUE;
	$msg .= "Spamming! I can't do that. Sorry.";
}

if(! ($error)) {
//Hotlink Code
if(eregi($_SERVER["HTTP_HOST"], str_replace("www.", "",
strtolower($_SERVER["HTTP_REFERER"]))))
{
	if (! isset($_GET['send_file'])) {

		Header("Refresh: 5;
url=http://my.com/$thisfile?model=$model&file=$req_file&send_file=yes");
		
	}
	else {
				
		header("Cache-Control: public");
		header('Content-Description: File Transfer');
		header("Content-type: application/octet-stream");
		//header('Content-Type: application/force-download');
		//header('Content-Length: ' . filesize($fileserver_path.$req_file));
		header('Content-Disposition: attachment; filename=' . $req_file);
		header("Content-Transfer-Encoding: binary");
		header("X-Accel-Redirect: /shipped/" . $path);
					
		exit;
		
	}
//More Hotlink Code	
 } else {
	Header("Refresh: ;
url=http://my.com/$thisfile?model=$model&file=$req_file");
 }
//End Hotlink 
}
?>

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,230161,230161#msg-230161



More information about the nginx mailing list