рдпрджрд┐ рдЖрдкрдХреЛ рд╕реАрдзреЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╛рдЗрд▓реЗрдВ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди PHP (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд╛рдЙрдирд▓реЛрдб рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
1. readfile()
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рд╡рд┐рдзрд┐ рдЕрдЪреНрдЫреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдиреЗ рдХреА рдХреНрд░рд┐рдпрд╛ (
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг) рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
function file_force_download($file) { if (file_exists($file)) {
рдЗрд╕ рддрд░рд╣, рдЖрдк рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ PHP рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝реЗрдЧреА рдФрд░ рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рджреЗрдЧреАред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐
readfile()
рдореЗрдореЛрд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ
рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ред
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
- рдкреВрд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдП рдЬрд╛рдиреЗ рддрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИред
- рдлрд╝рд╛рдЗрд▓ рдХреЛ рд░реАрдбрдлрд╝рд╛рдЗрд▓ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ 8kB рд╣реИ (рдзрдиреНрдпрд╡рд╛рдж 2fast4rabbit )
2. рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдврд╝реЗрдВ рдФрд░ рднреЗрдЬреЗрдВ
рдирд┐рдЬреА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдлрд╛рдЗрд▓ рднреЗрдЬрддреЗ рд╕рдордп рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рд╣реА Drupal рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ (рдлрд╛рдЗрд▓реЗрдВ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ):
function file_force_download($file) { if (file_exists($file)) {
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
- рдкреВрд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдП рдЬрд╛рдиреЗ рддрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИред
- рд╕рд░реНрд╡рд░ рдореЗрдореЛрд░реА рдмрдЪрд╛рддрд╛ рд╣реИ
3. рд╣рдо рд╡реЗрдм рд╕рд░реНрд╡рд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
3 рдПред рдЕрдкрд╛рдЪреЗ
XSendFile рдореЙрдбреНрдпреВрд▓ рдЕрдкрд╛рдЪреЗ рдХреЛ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рдВрд╕реНрдХрд░рдг 2.0 рдХреЗ рддрд╣рдд рдпреВрдирд┐рдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред *ред, 2.2ред * рдФрд░ 2.4ред *
рд╣реЛрд╕реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдЖрдкрдХреЛ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЗрдбрд░ рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
XSendFile On
рдЖрдк рдЙрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд╡реЗрдд рд╕реВрдЪреА рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬ-рдЖрдзрд╛рд░рд┐рдд рд╕рд░реНрд╡рд░ рд╣реИ, рддреЛ рдкрде рдореЗрдВ рдКрдкрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдЕрдХреНрд╖рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПредрдбреЗрд╡рд▓рдкрд░ рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг:
https://tn123.org/mod_xsendfile/рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
function file_force_download($file) { if (file_exists($file)) { header('X-SendFile: ' . realpath($file)); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); exit; } }
3 рдмреАред nginx
Nginx рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╣реЗрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреЙрдХреНрд╕ рд╕реЗ рдлрд╛рдЗрд▓ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдлрд╝реЛрд▓реНрдбрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
location /protected/ { internal; root /some/path; }
рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг (рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП / рдХреБрдЫ / рдкрде / рд╕рдВрд░рдХреНрд╖рд┐рдд):
function file_force_download($file) { if (file_exists($file)) { header('X-Accel-Redirect: ' . $file); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); exit; } }
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдкреГрд╖реНрда рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
- рд╕рднреА рдирд┐рд░реНрджреЗрд╢ рдкреВрд░реЗ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
- рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдлрд╝рд╛рдЗрд▓ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╣реА рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ, PHP рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ
- рдиреНрдпреВрдирддрдо рд╕реНрдореГрддрд┐ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЦрдкрдд
- рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди
рдЕрджреНрдпрддрди: ilyaplot
habrayuzer рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ рдХрд┐
application/octet-stream
рдирд╣реАрдВ рднреЗрдЬрдирд╛ рдмреЗрд╣рддрд░
application/octet-stream
, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реЗрд╡ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдпрд▓реЙрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред