2017-03-05 26 views
1

我只想向受權用戶提供受保護的圖像。所以我在控制器內使用BinaryFileResponse,它工作正常。不過,我想使用Nginx的XSendfile(X-Accel-Redirect)。我已經完成了與Nginx的documantation中所解釋的相同的步驟。Symfony - 如何使用nginx的X-Accel-Redirect從控制器提供圖像

此外我還將BinaryFileResponse::trustXSendfileTypeHeader();添加到控制器。但是現在我一直在收到404響應。

這裏是我的CONFIGS和代碼:

Nginx的:

server { 
    listen 80; 
    listen 443 ssl http2; 
    server_name symfony.app; 
    root "/home/vagrant/Sites/Symfony/web"; 

    index index.html index.htm index.php app.php app_dev.php; 

    charset utf-8; 

    location/{ 
     try_files $uri $uri/ /app.php?$query_string; 
    } 

    location /images/ { 
     internal; 
     alias /home/vagrant/Sites/Symfony/app/media/images/listings/4/; 
    } 

    client_max_body_size 100m; 

    # DEV 
    location ~ ^/(app_dev|app_test|config)\.php(/|$) { 
     #fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; # allows trailing slash after app_dev.php/ 
     fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

     fastcgi_intercept_errors off; 
     fastcgi_buffer_size 16k; 
     fastcgi_buffers 4 16k; 
    } 

    # PROD 
    location ~ ^/app\.php(/|$) { 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

     fastcgi_intercept_errors off; 
     fastcgi_buffer_size 16k; 
     fastcgi_buffers 4 16k; 
     internal; 
    } 

    location ~ /\.ht { 
     deny all; 
    } 

    ssl_certificate  /etc/nginx/ssl/symfony.app.crt; 
    ssl_certificate_key /etc/nginx/ssl/symfony.app.key; 
} 

Symfony的控制器:

public function getPictureAction($id) 
    { 
     $filePath = 'media/images/listings/4/'; 
     $path = $this->get('kernel')->getRootDir() . '/' . $filePath . $id; 

     BinaryFileResponse::trustXSendfileTypeHeader(); 

     $response = new BinaryFileResponse($path); 

     $response->headers->set('Content-Type', 'image/jpg'); 
     $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE); 
     return $response; 
    } 

所以,要http://symfony.app/images/1 .jpg應該會返回一張圖片,但會得到一張404圖片。

+0

添加到OP您使用過'getPictureAction' –

+0

@MaxP拿到照片的URL。你好。我不明白OP的意思嗎? – rvaliev

+0

OP =原文,問題 –

回答

1

/images/位置被標記爲內部位置,因此無法訪問來自瀏覽器的外部請求。 http://nginx.org/en/docs/http/ngx_http_core_module.html#internal

我認爲getPictureAction該路由路徑/images/{id},而且由於nginx的具有相同位置/images/是內部,並返回404錯誤是不可訪問。

重命名nginx的位置/images-internal/

location /images-internal/ { 
    internal; 
    alias /home/vagrant/Sites/Symfony/app/media/images/listings/4/; 
} 

,並更改PHP代碼:

public function getPictureAction(Request $request, $id) 
{ 
    $dir = $this->get('kernel')->getRootDir() . '/' . 'media/images/listings/4/'; 
    $path = $dir . $id; 

    $request->headers->set('X-Sendfile-Type', 'X-Accel-Redirect'); 
    $request->headers->set('X-Accel-Mapping', $dir . '=/images-internal/'); 

    BinaryFileResponse::trustXSendfileTypeHeader(); 

    $response = new BinaryFileResponse($path); 

    $response->headers->set('Content-Type', 'image/jpg'); 
    $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE); 

    return $response; 
} 
+0

它的工作。很難看到圖像是否直接由nginx服務(無法在頭文件中找到任何內容),但通過調試BinaryFileResponse類,我可以真正看到您的解決方案真正起作用。謝謝! – rvaliev

+0

爲什麼不是symfony文檔的這一部分? –

相關問題