如何在使用nginx下载时动态重命名PDF文件创建重写规则?

时间:2015-06-04 16:54:46

标签: mod-rewrite nginx rewrite

我正在网站上工作,我允许用户下载PDF文件。 每个PDF文件使用随机哈希名称存储在服务器上, 例如

file
768E1F881783BD61583D64422797632A35B6804C.pdf 
is stored in
/usr/share/nginx/html/contents/7/6/8/E/1/768E1F881783BD61583D64422797632A35B6804C.pdf 

现在我可以尝试为用户提供文件的直接位置,但是下载后的文件名显示为768E1F881783BD61583D64422797632A35B6804C.pdf,我想动态重命名文件,我可以使用这样的PHP来实现这个目的

<?php
// We'll be outputting a PDF  
header('Content-type: application/pdf');

// It will be called downloaded.pdf  
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf  
readfile('original.pdf');
?> 

参考:Rename pdf file to be downloaded on fly

但我正在直接购买nginx规则,可以将下载网址重写为路径并在运行时重命名。

我该怎么办?

我尝试过这样的事情。

location ^/download-pdf {
    alias   /usr/share/nginx/html/contents;
if ($request_filename ~ ^.*?/[^/]*?_(.*?\..*?)$)
{
    set $filename $1;
}

add_header Content-Disposition 'attachment; filename=$filename';
}

所以如果我将用户发送到这个位置

domain.com/download-pdf/768E1F881783BD61583D64422797632A35B6804C.pdf?title=this.is.test

然后我希望使用标题/文件名将这个文件下载到用户PC上 this.is.test.pdf

/usr/share/nginx/html/contents/7/6/8/E/1/768E1F881783BD61583D64422797632A35B6804C.pdf 

只能使用nginx重写规则来完成吗?或者我也需要使用PHP

UPDATE1:

我试过像这样使用它

location ^/download-pdf/([0-9A-F])/([0-9A-F])/([0-9A-F])/([0-9A-F])/([0-9A-F])/([0-9A-F]+).pdf$ {
    alias   /usr/share/nginx/basesite/html/contents;
add_header Content-Disposition 'attachment; filename="$arg_title.pdf"'; 
}

但是访问网址会发现404找不到错误。

UPDATE2:

尝试了这个

location ~ /download-pdf {
alias   /usr/share/nginx/html;
rewrite ^/download-pdf/([0-9a-fA-F])/([0-9a-fA-F])/([0-9a-fA-F])/([0-9a-fA-F])/([0-9a-fA-F])/([0-9a-fA-F]+).pdf$ /contents/$1/$2/$3/$4/$5/$6.pdf break;
add_header Content-Disposition 'attachment; filename="$arg_title.pdf"'; 
}

仍未找到404。

1 个答案:

答案 0 :(得分:9)

如果我没记错的话,你不能同时使用aliasrewrite。相反,只需使用位置正则表达式匹配,这些捕获将可用于add_headeralias指令:

location ~* /download-pdf/([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F]+)\.pdf$ {
    add_header Content-Disposition 'attachment; filename="$arg_title"';
    alias   /usr/share/nginx/basesite/html/contents/$1/$2/$3/$4/$5/$1$2$3$4$5$6.pdf;
}

这将匹配此网址:

https://www.example.com/download-pdf/768E1F881783BD61583D64422797632A35B6804C.pdf?title=SamplePdf.pdf

并将其映射到此文件路径:

/usr/share/nginx/basesite/html/contents/7/6/8/E/1/768E1F881783BD61583D64422797632A35B6804C.pdf

注意:如果有人想通过各种手段让正则表达式变得不那么难看,那就去吧!