Использую 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 не отбрасывал параметры ссылок?