рд╣рдо PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ

рдпрджрд┐ рдЖрдкрдХреЛ рд╕реАрдзреЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╛рдЗрд▓реЗрдВ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди PHP (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд╛рдЙрдирд▓реЛрдб рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

1. readfile() рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рд╡рд┐рдзрд┐ рдЕрдЪреНрдЫреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдиреЗ рдХреА рдХреНрд░рд┐рдпрд╛ ( рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг) рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:

 function file_force_download($file) { if (file_exists($file)) { //    PHP,        //          ! if (ob_get_level()) { ob_end_clean(); } //       header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); //       readfile($file); exit; } } 

рдЗрд╕ рддрд░рд╣, рдЖрдк рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ PHP рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝реЗрдЧреА рдФрд░ рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рджреЗрдЧреАред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ readfile() рдореЗрдореЛрд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ред

рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

2. рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдврд╝реЗрдВ рдФрд░ рднреЗрдЬреЗрдВ


рдирд┐рдЬреА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдлрд╛рдЗрд▓ рднреЗрдЬрддреЗ рд╕рдордп рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рд╣реА Drupal рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ (рдлрд╛рдЗрд▓реЗрдВ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ):

 function file_force_download($file) { if (file_exists($file)) { //    PHP,        //          ! if (ob_get_level()) { ob_end_clean(); } //       header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); //       if ($fd = fopen($file, 'rb')) { while (!feof($fd)) { print fread($fd, 1024); } fclose($fd); } exit; } } 

рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

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; } } 

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдкреГрд╖реНрда рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА

рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:


рдЕрджреНрдпрддрди: ilyaplot habrayuzer рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ рдХрд┐ application/octet-stream рдирд╣реАрдВ рднреЗрдЬрдирд╛ рдмреЗрд╣рддрд░ application/octet-stream , рд▓реЗрдХрд┐рди рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реЗрд╡ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдпрд▓реЙрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

Source: https://habr.com/ru/post/In151795/


All Articles