Nginx 返回带有文件扩展名的文件

Nginx 返回带有文件扩展名的文件

我正在 nginx 中的特定位置返回 pdf 文件。当有人访问 时mysite.com/resume,我希望resume.pdf返回我的,但重定向到 url mysite.com/resume.pdf(以便浏览器显示与 pdf 相关的下载/打印/等按钮)。

下面的内容返回 pdf,因为resume.pdf位于/dir/to/contents/,但 位于mysite.com/resume,而不是mysite.com/resume.pdf。我如何实现这种重定向?

server {
            listen       80;
            listen       [::]:80;
            server_name  mysite.com;
            root /dir/to/contents;

            location / {
                index site.html;
            }

}

- 编辑:解决第一条评论

答案1

添加.pdf/resume(客户端不可见):

    rewrite ^(/resume)$ $1.pdf last;

向浏览器提供正确的文件名是个好主意,例如

    location ~* ([^/]*\.pdf)$ {
        add_header Content-Disposition 'attachment; filename="$1"';
    }

答案2

以下内容应该足够了(我确实测试过了):

rewrite ^/resume$ /resume.pdf last;

正如 @Piotr P. Karwasz 所指出的,MIME 类型检测将由 NGINX 处理。由于重写最终会生成一个.pdf文件,因此 NGINX 将正确地将其作为 提供application/pdf

仅当您希望提示下载文件时才需要@edo1 的额外位,而不是浏览器的默认行为(许多 - 在浏览器中显示)。

答案3

edo1 和 Danila Vershinin 的答案都会返回 pdf,但都是在没有.pdf结尾的 url 处返回它 - 对于我希望返回带有扩展名的文件的挑剔用例,.pdf我发现下面的指令可以工作。

server {
    ...
    rewrite ^/resume$ resume.pdf redirect;
    ...
}

不确定这是否比其他答案提供的性能更差,或者它是否不那么惯用,但它确实满足了我的要求。最后redirect返回 302。

相关内容