如何在Symfony中使用Nginx X-Accel?

时间:2017-06-02 07:27:33

标签: symfony nginx x-sendfile x-accel-redirect

我想将Nginx X-Accel与Symfony一起使用,目前我已经有了这段代码。

    $request->headers->set('X-Sendfile-Type', 'X-Accel-Redirect');
    $request->headers->set('X-Accel-Mapping', '/var/www/html/files/=/protected-files/');
    $request->headers->set('X-Accel-Limit-Rate', '1k');

    BinaryFileResponse::trustXSendfileTypeHeader();
    $response = new BinaryFileResponse($file->getAbsolutePath());
    $response->headers->set('Content-Disposition', 'attachment;filename="'.$filename.'"');
    $response->headers->set('Cache-Control', 'no-cache');

    return $response;

和Nginx Conf:

location /protected-files {
    internal;
    alias /var/www/html/files;
}

为了测试代码(知道文件是否真的由Nginx提供),我在1ko / s上添加了一个X-Accel-Limit-Rate,但是立即下载了一个2Mo文件,然后我确定,它不能正常工作。

我在互联网上找到了这部分代码,因为Symfony doc并没有真正解释如何使用它...(http://symfony.com/doc/current/components/http_foundation.html#serving-files

为什么我需要在文件中返回BinaryResponse,比如没有Nginx X-Sendfile,并在resuqest中添加X-Sendfile,X-Accel属性?我只是返回响应,没有请求,它是如何工作的?

1 个答案:

答案 0 :(得分:2)

最后,我将X-Accel部分从$ request移动到$ response,然后设置X-Accel-Redirect标头。

如果我们想限制下载速度,我们可以使用$request->headers->set('X-Accel-Limit-Rate', 10000);,它运行良好,数字以字节为单位。

然后我将$response->headers->set('Content-Disposition', 'attachment;filename="'.$filename.'"');更改为$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename);

最终代码是:

BinaryFileResponse::trustXSendfileTypeHeader();
$response = new BinaryFileResponse($file->getAbsolutePath());
$response->setContentDisposition(
    ResponseHeaderBag::DISPOSITION_ATTACHMENT,
    $filename
);
$response->headers->set('X-Accel-Redirect', '/protected-files/path/to/file');

return $response;

在Nginx:

location /protected-files/ {
    internal;
    alias /var/www/html/files/;
}