چطوری میتونم لینک اصلی رو مخفی کنم ؟؟
لینک یک : dl.site.ir/file.zip
لینک دو: site.ir/?download=file.zip
مثلن با بازکردن لینک دوم بدون اینکه ریدایرکت بشه به لینک اول و بدون دیده شدن لینک اول(حتی در دانلود منیجر) باعث دانلود شد file.zip که تو لینک اول بود بشه . در واقع لینک دوم یه پل باشه بین دانلودر و لینک اصلی . همچین چیزی رو تو "وب پروک30" دیده بودم اگه ممکنه یه توضیحی بدین چطوریاس و چطور میشه همچین چیزی نوشت(php)
@MOHAMMAD026_1 @aalireza439 و سایر دوستان...
متشکرم
برای انجام اینکار ۲ راه هست ، راه اول که محمدم گفت ، قبل از دسترسی کاربر به فایل ، خوندن اون فایل توسط php و بعدش هم انتقال سمت کاربر (حالا اون بین میتونی هر کاری و یا محدودیت دسترسی رو قرار بدی)
مشکل این روش این هست که به هر فایل باید از طریق بافر php کش بشه و از نظر عملکرد بهینه نیست (بخصوص برای فایل های بزرگ)
راه دوم استفاده از قابلیتی است به نام X-SendFile که اکثر وب سرور های معروف این قابلیت رو دارن (تو Nginx بهش X‑Accel‑Redirect گفته میشه)
به طور خیلی ساده بخواهم بگم ، کار X-SendFile این هست که یک ریدایرکت داخلی انجام میده ، بعنی اینکه به جای اینکه کاربر رو آدرس URL فایل منتقل کنه به اون مکانی که قبلا برای اون فایل توی وب سرور تعریف کردی منتقل میکنه.
نحوه استفاده از X-Sendfile خیلی آسونه ، فقط کافیه توسط سمت سرور (حالا هر زبانی میخواهد باشه) یک هدر X-Sendfile به همراه مسیر اون فایل که قرار برای کاربر دانلود بشه رو بفرستی.
این هم یک مثال (تو این مثال وب سرور رو Nginx در نظر گرفتم)
فایل کانفیگ وب سرور
کد:
http {
server {
listen 80;
server_name your-domain.com;
location /files {
root /var/www;
internal;
}
}
}
تو فایل کانفیگ بالا ، محل اصلی فایل ها مون مسیر /var/www هست که ما اومدیم ، یک لوکیشن براش تعریف کردیم ، با مسیر files (یعنی وقتی یک درخواست فایلی به این مسیر ارسال بشه ، Nginx میاد تو دایرکتوری /var/www دنبال اون فایل میگرده)
اگر توجه کنید تو لوکیشن یک گزینه internal هم تعریف شده ، این گزینه این امکان رو میده که اون مسیر فقط از طریق درخواست های داخلی و X‑Accel‑Redirect قابل دسترس باشه ، کسی از بیرون نمیتونه فایل های اون مسیر رو بهش دسترسی داشته باشه.
حالا که وب سرور کانفیگ شد ، فقط کافیه درخواست دانلود فایل رو با هدر X‑Accel‑Redirect سمت وب سرور ارسال کنیم
نمونه کد php:
درخواست فایل :
http://domain.com/download.php?file=a_sample_file.zip
PHP:
<?php
// گرفتن نام فایل
$path = $_GET["file"];
//...
// کنترل دسترسی یا هر چیز دیگه
//...
// و در نهایت در صورتی که کاربر دسترسی لازم رو داشت ،انتقال به مسیر داخلی
header("X-Accel-Redirect: /files/" . $path);
?>