ืคืจืืืกืืืจืื
ืงืจื ืฉืืืืชื ืฆืจืื ืืืืกื ืืืชืจ ื-1.5 TB ืฉื ื ืชืื ืื ืืืคืฉืื, ืืื ืืกืคืง ืืช ืืืืืืช ืืืฉืชืืฉืื ืจืืืืื ืืืืจืื ืืืชื ืืจื ืงืืฉืืจ ืืฉืืจ. ืืืืืื ืฉืืืืคื ืืกืืจืชื ืืืืืืช ืืืื ืฉื ืืืืจืื ืขืืืจืืช ื-VDS, ืขืืืช ืืืฉืืจื ืฉืืื ื ืืืืื ืืชืงืฆืื ืืคืจืืืงื ืืงืืืืจืืืช "ืืื ืื ืืขืฉืืช", ืืื ืชืื ื ืืืงืืจ ืืื ืื VPS 400GB SSD, ืฉืื, ืื ืื ืื ื ืจืฆืืชื, ืื ืืืืืชื ืืฉืื 1.5TB ืฉื ืชืืื ืืช ืืื ืืืืกื ืืื ืืืืื ืื ืืฆืืื.
ืืื ื ืืืจืชื ืฉืื ืื ื ืืืืง ืืื ืืืืื ืืจืืื, ืืื ืชืืื ืืืช ืฉืืจืืฆื ืจืง ื-Windows XP, ืืขืื ืืืจืื ืฉืขืืืจืื ืืืืฉืืจ ืืื ืืืฉื ืื ืืื ืืืืื ืฉืืื ืืืื ืืจื ื ืื ืืื ืื ืื ืืืืจ ืืืื ืื ืืืชื ืืืืื ( ืืืืืื, ืื ืืื ืกืืืจ ืฉ-10-20 ืืืจืกืืืช ืืืื ืฉื ืืงืืคืกื ืืืืจืืืืืืช ืืืื ืืขืื ืขืจื ืืืจ ืืืื ื ืืกืืืืื), ืื ืืื ืืืืจ ืืืชืืื ืืืื. ืื ืืืงืื ืืืชืจ ืืืฉืจ ื ืขืฉื. ืืื, ืชืื ืคืจืืฆืช ืืืืืช ืืกืคืจ ืืืงืฉืืช ื-API (ืืื, ืชืืืื ืืื ืืช ืืื ืืขืืืช ืืืืืื ืืช ืืืกืช ืืืงืฉืืช ืืืฉืชืืฉ ื-100 ืชืื 10 ืฉื ืืืช), ืื ืชืื ืื ืืจืื ืืืืืจืืช ืืืงืื ืืคืจืืกื ืื ืืกืคืช ืฉืื. .
ืืื ื ืจืื ืืื, ืืื ืขืืฉืื ืฆืจืื ืืืขืืืจ ืืช ืื ืืืฉืชืืฉ ืืงืฆื. ืืชืจ ืขื ืื, ืืื ืื ืืคื ืืืช ืืืฉืืืื ืืืจืื, ืืื ืื ืฉืืื ืคืฉืื ืืืืฅ ืขื ืืคืชืืจ "ืืืจื" ืืืืคื ืืืขืืื ืืืืืฉืจ ืฉื ืืงืืืฅ ืืืงืจ.
ืืื, ืืืืืื, ื ืื ืกืชื ืืื ืืื ื ืฆืจืืช. ืืืชืืื ืื ืืื ืกืงืจืืคื ื-AmPHP, ืืื ืื ืืืืชื ืืจืืฆื ืืืขืืืก ืฉืืื ืืฆืจ (ืงืคืืฆื ืืื ืืืชืืื ื-100% ืฆืจืืืช ืืืื). ืืื ื ืื ืกื ืืืฉืืง ืืขืืคืช ืืชืืชืืื ืฉื ReactPHP, ืฉืื ืืชืืืื ืืจืฆืื ืืช ืฉืื ืืืืื ืช ืืกืคืจ ืืืืืจื ืืืขืื ืฉื ืฆืจืื, ืืื ืื ื ืชื ื ืืช ืืืืืจืืช ืืืื ืื ืฉืจืฆืืชื (ืืชืืจืจ ืฉืืคืฉืจ ืคืฉืื ืืฆืืฆื ืืช ืืจืืื ืืืชืงืฉืจืืช curl_multi_select, ืืื ืื ืืฉ ืื ื ืืจืืจื ืืช ืืืื ืืืคืฉืจืืช ืืจืืฉืื ื ). ืืคืืื ื ืืกืืชื ืืืชืื ืฉืืจืืช ืงืื ื-Rust, ืืื ืขืื ืื ืืืจ (ืืคืชืืข ืฉืื ืขืื, ืืืชืืฉื ืืืืข ืฉืื), ืืื ืจืฆืืชื ืืืชืจ, ืืืืืฉืื ืืื ืงืฉื ืืืชืืื ืืืชื. ืื ืืกืฃ, ืื ืืคืชืจืื ืืช ืืืื ืืืืฉืื ืืืืจื ืืช ืืชืืืื ืืฆืืจื ืืืืจื, ืืจืฆืืชื ืืขืงืื ืืืจ ืืจืืข ืฉืื ืืืจืืช ืืงืืืฅ ืืกืชืืืื ืืืืืง ืืื ืืืื.
ืืืืคื ืืืื, ืื ืืื ืขืงืื ืืืื ืื, ืืื ืื ืขืื. ืขื ืฉืืื ืืื ืืืขืชื ืืจืขืืื ืืืืื ืืืืจืืฃ ืฉืื: nginx, ืืชืืืืจืื, ืืืื ืืขืฉืืช ืื ืฉืื ื ืจืืฆื, ืืขืืื ืืืจ, ืืืคืืื ืืืคืฉืจ ืื ืืื ื ืกืืืืช ืขื ืงืื ืคืืืืจืฆืื. ืื ืื ื ืืืืืื ืื ืกืืช - ืื ืื ืื ืขืืื? ืืืืจื ืืฆื ืืื ืฉื ืืืคืืฉืื ืืชืืืืื, ื ืืื ืคืชืจืื ืฉืขืื ืืืฆืืืืช ืืืจ ืืื ืืืืฉืื ืืขืื ื ืขื ืื ืืืจืืฉืืช ืฉืื.
ืืืืจืช NGINX
# ะะตัะฒัะผ ะดะตะปะพะผ ัะพะทะดะฐะดะธะผ ะฒ ะบะพะฝัะธะณะฐั
ะฝะฐัะตะณะพ ัะฐะนัะฐ ะพัะดะตะปัะฝัั ะปะพะบะฐัะธั.
location ~* ^/google_drive/(.+)$ {
# ะ ะทะฐะบัะพะตะผ ะตั ะพั ะฟะพััะพัะพะฝะฝะธั
ะณะปะฐะท (ััะบ, ะฝะพะณ ะธ ะฟัะพัะธั
ัะฐััะตะน ัะตะปะฐ).
internal;
# ะะณัะฐะฝะธัะธะผ ะฟะพะปัะทะพะฒะฐัะตะปัะผ ัะบะพัะพััั ะดะพ ัะฐะทัะผะฝัั
ะฟัะตะดะตะปะพะฒ (ั ะทะฐ ัะฐะฒะฝะพะฟัะฐะฒะธะต).
limit_rate 1m;
# ะ ััะพะฑ nginx ะผะพะณ ะฝะฐะนัะธ ัะตัะฒะตัะฐ google drive ัะบะฐะถะตะผ ะตะผั ะฐะดัะตั ัะตะทะพะปะฒะตัะฐ.
resolver 8.8.8.8;
# Cะพะฑะตัะตะผ ะฟััั ะบ ะฝะฐัะตะผั ัะฐะนะปั (ะผั ะฟะพัะพะผ ะฟะตัะตะดะฐะดะธะผ ะตะณะพ ะทะฐะณะพะปะพะฒะบะฐะผะธ).
set $download_url https://www.googleapis.com/drive/v3/files/$upstream_http_file_id?alt=media;
# ะ ัะฐะบ ะถะต Content-Disposition ะทะฐะณะพะปะพะฒะพะบ, ะธะผั ัะฐะนะปะฐ ะผั ะฟะตัะตะดะฐะดะธะผ ะพะฟััั ะถะต ะฒ ะทะฐะณะพะปะพะฒะบะฐั
.
set $content_disposition 'attachment; filename="$upstream_http_filename"';
# ะะฐะฟัะตัะธะผ ะฑัััะตัะธะทะธัะพะฒะฐัั ะพัะฒะตั ะฝะฐ ะดะธัะบ.
proxy_max_temp_file_size 0;
# ะ, ััะพ ะฝะตะผะฐะปะพะฒะฐะถะฝะพ, ะฟะตัะตะดะฐะดะธะผ ะทะฐะณะพะปะพะฒะพะบ ั ัะพะบะตะฝะพะผ (ะฝะต ะทะฝะฐั ะฟะพัะตะผั, ะฝะพ ะฒ ะทะฐะณะพะปะพะฒะบะฐั
ะธะท $http_upstream ัะพะบะตะฝ ะฟะตัะตะดะฐัั ะฝะต ะฟะพะปััะธะปะพัั. ะะตัะฝะตะต ะฟะตัะตะดะฐัั ะฟะพะปััะธะปะพัั, ะฝะพ ัะบะพัะตะน ะฒัะตะณะพ ะตะณะพ ะณะดะต-ัะพ ะฝัะถะฝะพ ัะบัะฐะฝะธัะพะฒะฐัั, ะฟะพัะพะผั ััะพ ะณัะณะป ะพัะดะฐะตั ะพัะธะฑะบั ะฐะฒัะพัะธะทะฐัะธะธ).
proxy_set_header Authorization 'Bearer $1';
# ะ ะฒัะต, ะพััะฐะปะพัั ะพัะฟัะฐะฒะธัั ะทะฐะฟัะพั ะณัะณะปั ะฟะพ ัะฐะฝะตะต ัะพะฑัะฐะฝะฝะพะผั ะฝะฐะผะธ ะฐะดัะตัั.
proxy_pass $download_url;
# ะ ััะพะฑ ั ะฟะพะปัะทะพะฒะฐัะตะปั ะฟัะธ ัะบะฐัะธะฒะฐะฝะธะธ ะพัะพะฑัะฐะทะธะปะพัั ะฟัะฐะฒะธะปัะฝะพะต ะธะผั ัะฐะนะปะฐ ะผั ะดะพะฑะฐะฒะธะผ ัะพะพัะฒะตัััะฒัััะธะน ะทะฐะณะพะปะพะฒะพะบ.
add_header Content-Disposition $content_disposition;
# ะะฟัะธะพะฝะฐะปัะฝะพ ะผะพะถะฝะพ ะฟะพัะฑะธัะฐัั ะฝะตะฝัะถะฝัะต ะฝะฐะผ ะทะฐะณะพะปะพะฒะบะธ ะพั ะณัะณะปะฐ.
proxy_hide_header Content-Disposition;
proxy_hide_header Alt-Svc;
proxy_hide_header Expires;
proxy_hide_header Cache-Control;
proxy_hide_header Vary;
proxy_hide_header X-Goog-Hash;
proxy_hide_header X-GUploader-UploadID;
}
ืืจืกื ืงืฆืจื ืืื ืืขืจืืช ื ืืชื ืืจืืืช ืืชืืช ืืกืคืืืืจ
location ~* ^/google_drive/(.+)$ {
internal;
limit_rate 1m;
resolver 8.8.8.8;
set $download_url https://www.googleapis.com/drive/v3/files/$upstream_http_file_id?alt=media;
set $content_disposition 'attachment; filename="$upstream_http_filename"';
proxy_max_temp_file_size 0;
proxy_set_header Authorization 'Bearer $1';
proxy_pass $download_url;
add_header Content-Disposition $content_disposition;
proxy_hide_header Content-Disposition;
proxy_hide_header Alt-Svc;
proxy_hide_header Expires;
proxy_hide_header Cache-Control;
proxy_hide_header Vary;
proxy_hide_header X-Goog-Hash;
proxy_hide_header X-GUploader-UploadID;
}
ืื ืื ื ืืืชืืื ืชืกืจืื ืืื ืื ืื ืืช ืื ืืืืฉืจ ืืื
ืืืืืื ืชืืื ื-PHP ืืืชืืื ืืืืื ื ืขื ืืื ืืืื ืขืจืื. ืื ื ืืืฉื ืฉืื ืื ืฉืืฉ ืื ื ืืกืืื ืืื ืฉืคื ืืืจืช ืืืื ืืฉืื ืืช ืืงืืข ืืื ืืืืฆืขืืช ืืืืืื ืฉืื.
<?php
# ะขะพะบะตะฝ ะดะปั Google Drive Api.
define('TOKEN', '*****');
# ID ัะฐะนะปะฐ ะฝะฐ ะณัะณะป ะดะธัะบะต
$fileId = 'abcdefghijklmnopqrstuvwxyz1234567890';
# ะะฟัะธะพะฝะฐะปัะฝะพ, ะฝะพ ัะฐะบ ะบะฐะบ ะผั ะฝะต ะฟะตัะตะดะฐะตะผ ะฝะธะบะฐะบะธั
ะดะฐะฝะฝัั
- ะฟะพัะตะผั ะฑั ะธ ะฝะตั?
http_response_code(204);
# ะะฐะดะฐะดะธะผ ะทะฐะณะพะปะพะฒะพะบ c ID ัะฐะนะปะฐ (ะฒ ะบะพะฝัะธะณะฐั
nginx ะผั ะฟะพัะพะผ ะฟะพะปััะธะผ ะตะณะพ ะบะฐะบ $upstream_http_file_id).
header('File-Id: ' . $fileId);
# ะ ะทะฐะณะพะปะพะฒะพะบ ั ะธะผะตะฝะตะผ ัะฐะนะปะฐ (ัะพะพัะฒะตัััะฒะตะฝะฝะพ $upstream_http_filename).
header('Filename: ' . 'test.zip');
# ะะฝัััะตะฝะฝะธะน ัะตะดะธัะตะบั. ะ ะตัะต ะฒ ะฐะดัะตัะต ะผั ะฟะตัะตะดะฐะดะธะผ ัะพะบะตะฝ, ัะพั ัะฐะผัะน, ััะพ ะผั ะฟะพะปััะฐะตะผ ะธะท $1 ะฒ nginx.
header('X-Accel-Redirect: ' . rawurlencode('/google_drive/' . TOKEN));
ืชืืฆืืืช ืฉื
ืืืืคื ืืืื, ืฉืืื ืื ืืงืื ืืืื ืขื ืืจืืื ืืคืฆืช ืืงืืฆืื ืืืฉืชืืฉืื ืืื ืืืกืื ืืขื ื. ืื, ืืคืืื ืืืืืจื ืื VK, (ืืชื ืื ืฉืืืื ืืงืืืฅ ืื ืืืจื ืืืืืื ืืืืชืจ ืฉื ืืืกืื ืื). ืืื ืื ืจืขืืื ืืืื ืืื
ืชืืื ืื ืขื ืชืฉืืืช ืืื. ืื ื ืืงืืื ืฉืืกืืคืืจ ืฉืื ืืื ืืคืืืช ืงืฆืช ืืขื ืืื ืื ืฉืืืืฉื ืขืืืจื.
ืืงืืจ: www.habr.com