Добрый день!
Передача пути к файлу через метод `$_GET` в PHP требует большой осторожности, так как это может привести к уязвимостям, таким как Directory Traversal (перемещение по директориям). Убедитесь, что вы обрабатываете входящие параметры корректно и проверяете их, прежде чем использовать.
Чтобы настроить скачивание файла и избежать ошибки 404, выполните следующие шаги:
1. **Проверьте, чтобы файл существовал.**
Тщательно проверяйте, существует ли файл по запрашиваемому пути.
2. **Используйте абсолютные пути или настраиваемые директории.**
Вместо того чтобы использовать относительные пути и опасные конструкции, можно задать фиксированную директорию для хранения файлов и проверять, находится ли запрашиваемый файл в этой директории.
3. **Пример кода:**
Вот пример того, как можно реализовать загрузку файла, избегая уязвимостей:
```php
// download.php
$basePath = __DIR__ . '/../uploads/'; // Базовая директория для файлов
$file = basename($_GET['file']); // Берем только имя файла
$filePath = $basePath . $file; // Полный путь к файлу
// Проверяем, существует ли файл
if (file_exists($filePath)) {
// Настраиваем заголовки для скачивания
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filePath));
readfile($filePath); // Читаем файл и отправляем его
exit;
} else {
// Обрабатываем 404 ошибку
http_response_code(404);
echo "Файл не найден.";
exit;
}
```
4. **Ссылки на файлы:**
При создании ссылок используйте `urlencode()` для безопасной передачи имен файлов в URL.
```php
$file_name = 'file.ext'; // имя файла
$path_to_file = urlencode($file_name);
echo "<a href='../core/download.php?file=$path_to_file' class='download-a'>Скачать файл</a>";
```
С использованием таких методов вы сможете избежать ошибок и максимально обезопасить свой код.