gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:54:30 25 4
gpt4 key购买 nike

我在允许用户下载 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 规则,它可以将下载 url 重写为路径并即时重命名。

我该怎么做?

我试过这样的事情。
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也 ?

更新1:

我试过像这样使用它
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"';
}

但是访问 url 给出了 404 not found 错误。

更新2:

试过这个
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。

最佳答案

您不能同时使用 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;
}

这将匹配此 URL:
https://www.example.com/download-pdf/768E1F881783BD61583D64422797632A35B6804C.pdf?title=SamplePdf.pdf

并将其映射到此文件路径:
/usr/share/nginx/basesite/html/contents/7/6/8/E/1/768E1F881783BD61583D64422797632A35B6804C.pdf

注意:如果有人想让那个正则表达式不那么难看,那就去吧!

关于mod-rewrite - 如何在使用 nginx 下载时创建重写规则以动态重命名 PDF 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com