YiiFramework Yii nginx internal redirect content-type всегда text/html

kvn

programmer
Привет
задам вопрос здесь, может это связано именно с фреймворком Yii2

Задача: нужно секурно (авторизованным юзерам) отдать папку с html-файлами (типа мини сайтик)
Сделано через nginx internal redirect

Проблема: в папке файлы разного тима, и при запросе через X-Accel-Redirect у отдаваемых клиенту файлов всегда Conten-Type: text/html
для картинок, текстовых - все равно...
WTF?

Вот контроллер:
PHP:
    public function actionPlay()
    {
        if (!Yii::$app->user->identity->canAdditionalDownload()) {
            return $this->redirect(['play/login']);
        }
        header("X-Accel-Redirect: /internal_files/" . Yii::$app->request->get('fileName'));
        return true;
    }

пробовал послать принудительно content-type, но результат тот же, на выходе text/html
Может где-то переопределяется?
PHP:
    public function actionPlay()
    {
        if (!Yii::$app->user->identity->canAdditionalDownload()) {
            return $this->redirect(['play/login']);
        }
        header("X-Accel-Redirect: /internal_files/" . Yii::$app->request->get('fileName'));
        $ctype = mime_content_type(Yii::getAlias('@webroot').'/../games/'.Yii::$app->request->get('fileName'));
        header("Content-Type: $ctype", true);
        return true;
    }
nginx.conf:

location /internal_files {
alias /home/htdocs/dev.host/frontend/folder/;
internal;
}

А может решается через nginx?
В общем че то я запутался...
 

fixxxer

К.О.
Партнер клуба
location /internal_files {
...
add_header Content-Type $upstream_http_content_type; (вроде так, но лучше погугли, это не совсем документированная фича с такими переменными)
 

kvn

programmer
location /internal_files {
...
add_header Content-Type $upstream_http_content_type; (вроде так, но лучше погугли, это не совсем документированная фича с такими переменными)
Фича прикольная, спасибо!
Но теперь получилось в респонзе два хидера:

http://prntscr.com/cjdvo9

Судя по всему нужно как-то указать фреймворку, что контент-тайп не переопределять, не знаю как это сделать..не спец..:(
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
yii тут ни при чем, text/html - это дефолтный content-type, который отдает php, он указан в php.ini
чтобы давать другое значение - укажи, что заголовок надо заменить
 

fixxxer

К.О.
Партнер клуба
можешь отдать со стороны php какой-нибудь X-Accel-Content-Type, какая разница, все равно переменная в nginx пишется явно, какая угодно

upd: с таким вариантом еще может понадобиться fastcgi_ignore_headers Content-Type
 
Последнее редактирование:

kvn

programmer
yii тут ни при чем, text/html - это дефолтный content-type, который отдает php, он указан в php.ini
чтобы давать другое значение - укажи, что заголовок надо заменить
я же во втором варианте указываю, но это ни на что не влияет. Отдается все равно text-html
Причем для js-файлов - корректно.

пофиксилось так:

PHP:
    public function actionPlay()
    {
        if (!Yii::$app->user->identity->canAdditionalDownload()) {
            return $this->redirect(['play/login']);
        }

        Yii::$app->response->headers
            ->set('Content-Type', mime_content_type(Yii::getAlias('@webroot').'/../games/'.Yii::$app->request->get('fileName')));
        Yii::$app->response->format = Response::FORMAT_RAW;

        header("X-Accel-Redirect: /internal_files/" . Yii::$app->request->get('fileName'));

        return true;
    }
 

kvn

programmer
можешь отдать со стороны php какой-нибудь X-Accel-Content-Type, какая разница, все равно переменная в nginx пишется явно, какая угодно
Хм...спасибо за фишку!

upd: с таким вариантом еще может понадобиться fastcgi_ignore_headers Content-Type
такое на сколько пробовал не прокатывает, именно Content-Type нельзя игнору скормить..., другие можно. Этот заголовок - ругается.
 
Сверху