dizelbox
@dizelbox

Nginx не учитывает параметры ссылок в подзапросах?

Использую zip_mod в Nginx для формирования динамических архивов из файлов, которые расположены на разных физических серверах. Примерно таким кодом отправляю заголовки Nginx-у для того, чтобы он собрал все в одну кучу от отправил пользователю:

<?php
header('Content-Disposition: attachment; filename=' . $archiveName);
header('X-Archive-Files: zip');
echo implode("\r\n", $zip_files) . "\r\n";
exit();



Массив $zip_files представляет собой примерно такой массив:

array(4) {
  [0] => string(140) "15263b8b 66000 /remote/127.0.1.1/files/private/ee4b41adb859ccce6be2fa0c45fc64f0.ini?name=php.ini&s=opPmjEJg5puHNciYvcRTeA,1359385713 php.ini"
  [1] => string(170) "bc8706b1 8361107 /remote/127.0.1.1/files/private/154eeb7eef9e55ce2da97d9f7cd6fee5.zip?name=nginx-1.2.6-build.zip&s=yy_iJjDxnCaix-tzDlrZ0Q,1359385713 nginx-1.2.6-build.zip"
  [2] => string(157) "9e7b9349 917698 /remote/127.0.1.1/files/private/597d93a30395e27a1f19f7e226187163.sql?name=tariff_dump.sql&s=Ob-V3hljvYODh0XVFU9dKQ,1359385713 tariff_dump.sql"
  [3] => string(145) "e7310915 225234 /remote/127.0.1.1/files/private/350679e790a7f702a5d37bee444de9f3.jpg?name=other.jpg&s=cHEvdSj5lU__35Utl8IRkg,1359385713 other.jpg"
}



В конфиге Nginx домена для обработки внешних ресурсов прописано следующее:

location ~* ^/remote/(.+?)/(.+)$ {
	internal;
	proxy_hide_header Content-Type;
	proxy_pass http://$1/$2;
}



Данная схема отлично работает, если ссылки к файлам не имеют параметров, например:

127.0.1.1/files/private/ee4b41adb859ccce6be2fa0c45fc64f0.ini



Но если ссылка имеет параметры, например:

127.0.1.1/files/private/ee4b41adb859ccce6be2fa0c45fc64f0.ini?name=php.ini&s=opPmjEJg5puHNciYvcRTeA,1359385713



, то в таком случае Nginx шлет подзапросы не учитывающие эти параметры. То есть вместо запроса:

127.0.1.1/files/private/ee4b41adb859ccce6be2fa0c45fc64f0.ini?name=php.ini&s=opPmjEJg5puHNciYvcRTeA,1359385713



делает запрос:

127.0.1.1/files/private/ee4b41adb859ccce6be2fa0c45fc64f0.ini



Вопрос в том, как можно избежать того, чтобы Nginx не отбрасывал параметры ссылок?
  • Вопрос задан
  • 2825 просмотров
Пригласить эксперта
Ответы на вопрос 3
tyzhnenko
@tyzhnenko
System Administrator, DevOps, QA Engineer
Попробуйте воспользоваться переменной $args.
Нечто вроде:
proxy_pass http://$1/$2?$args
Ответ написан
Комментировать
Модуль должен писать в лог
github.com/evanmiller/mod_zip/blob/master/ngx_http_zip_module.c#L564

Посмотрите что в логе
Ответ написан
Комментировать
dizelbox
@dizelbox Автор вопроса
Спасибо за ответы. Работает при таком конфиге:

		location ~* ^/remote/(.+?)/(.+)$ { # proxied download from storage
			internal;
			proxy_hide_header Content-Type; # correct Content-Type is set by backend
			proxy_pass http://$1/$2?$args;
		}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы