我正在网站上工作,我允许用户下载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。
答案 0 :(得分:9)
如果我没记错的话,你不能同时使用alias
和rewrite
。相反,只需使用位置正则表达式匹配,这些捕获将可用于add_header
和alias
指令:
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
注意:如果有人想通过各种手段让正则表达式变得不那么难看,那就去吧!