119 lines
5.6 KiB
Markdown
119 lines
5.6 KiB
Markdown
|
|
# Исправление проблемы с символом # в URL файлов S3
|
|||
|
|
|
|||
|
|
**Дата:** 15 октября 2025
|
|||
|
|
**Проблема:** Ошибка 403 при скачивании файлов из S3 с символом `#` в имени
|
|||
|
|
**Статус:** ✅ Исправлено
|
|||
|
|
|
|||
|
|
## Описание проблемы
|
|||
|
|
|
|||
|
|
При отправке документов в суд через скрипт `Send2Court.php` возникала ошибка 403 при скачивании некоторых файлов из S3:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
2025-10-15 15:00:07 - ошибка скачивания файла из S3, HTTP код: 403
|
|||
|
|
URL: .../8_Договор_на_оказание_услуг_08-27-2025-15-47-39_Агеев__13_CTP#realfile.pdf
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Причина
|
|||
|
|
|
|||
|
|
Символ `#` в URL интерпретируется браузерами и curl как **якорь** (anchor/fragment identifier). Всё после `#` считается частью фрагмента URL и не отправляется на сервер. Например:
|
|||
|
|
|
|||
|
|
- URL: `https://s3.example.com/file#realfile.pdf`
|
|||
|
|
- Сервер получает: `https://s3.example.com/file` ❌
|
|||
|
|
|
|||
|
|
Из-за этого S3 не мог найти файл и возвращал ошибку 403.
|
|||
|
|
|
|||
|
|
## Решение
|
|||
|
|
|
|||
|
|
Модифицирована функция `getTempFileFromS3()` в файле `/include/utils/Debexpert-guzzle.php`:
|
|||
|
|
|
|||
|
|
### Что изменено
|
|||
|
|
|
|||
|
|
1. **Автоматическая замена проблемных символов:**
|
|||
|
|
- `#` → `%23` (URL-кодированная версия)
|
|||
|
|
- ` ` (пробел) → `%20`
|
|||
|
|
|
|||
|
|
2. **Улучшенное логирование:**
|
|||
|
|
- Логируется исходный URL
|
|||
|
|
- Если URL был изменён, логируется исправленная версия
|
|||
|
|
- Легче отслеживать проблемы
|
|||
|
|
|
|||
|
|
### Пример работы
|
|||
|
|
|
|||
|
|
**До исправления:**
|
|||
|
|
```
|
|||
|
|
URL: https://s3.twcstorage.ru/bucket/file_CTP#realfile.pdf
|
|||
|
|
Результат: ❌ HTTP 403
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**После исправления:**
|
|||
|
|
```
|
|||
|
|
Исходный URL: https://s3.twcstorage.ru/bucket/file_CTP#realfile.pdf
|
|||
|
|
Исправленный: https://s3.twcstorage.ru/bucket/file_CTP%23realfile.pdf
|
|||
|
|
Результат: ✅ HTTP 200
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Затронутые файлы
|
|||
|
|
|
|||
|
|
- ✅ `/include/utils/Debexpert-guzzle.php` - функция `getTempFileFromS3()` обновлена
|
|||
|
|
- ℹ️ `/include/utils/Letters.php` - уже имеет обработку `#realfile` (другая сигнатура функции)
|
|||
|
|
|
|||
|
|
## Дополнительные преимущества
|
|||
|
|
|
|||
|
|
- Исправление работает автоматически, **не требует изменений в БД**
|
|||
|
|
- Обрабатывает не только `#`, но и пробелы
|
|||
|
|
- Логирование помогает отслеживать исправления
|
|||
|
|
- Совместимо со старыми URL без проблемных символов
|
|||
|
|
|
|||
|
|
## Рекомендации
|
|||
|
|
|
|||
|
|
### Для будущего
|
|||
|
|
|
|||
|
|
Рекомендуется при загрузке файлов в S3 **сразу очищать имена файлов** от проблемных символов:
|
|||
|
|
- Заменять `#` на `-` или `_`
|
|||
|
|
- Убирать или заменять пробелы на `_`
|
|||
|
|
- Избегать других спецсимволов: `&`, `?`, `%`, и т.д.
|
|||
|
|
|
|||
|
|
### Мониторинг
|
|||
|
|
|
|||
|
|
После внедрения исправления в логах `logs/send2court.log` появятся записи:
|
|||
|
|
```
|
|||
|
|
2025-10-15 15:00:07 - скачиваем файл из S3 (исходный URL): .../file#test.pdf
|
|||
|
|
2025-10-15 15:00:07 - URL исправлен для корректной загрузки: .../file%23test.pdf
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Это нормальное поведение и подтверждает, что исправление работает.
|
|||
|
|
|
|||
|
|
## Результаты проверки
|
|||
|
|
|
|||
|
|
**Дата:** 15 октября 2025, 16:41-16:43
|
|||
|
|
**Проект:** 390657 (Агеев / ООО СКИЛБОКС)
|
|||
|
|
|
|||
|
|
### ✅ Исправление работает идеально!
|
|||
|
|
|
|||
|
|
Все 5 проблемных файлов скачались успешно:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
2025-10-15 16:41:23 - скачиваем файл из S3 (исходный URL): ...CTP#realfile.pdf
|
|||
|
|
2025-10-15 16:41:23 - URL исправлен для корректной загрузки: ...CTP%23realfile.pdf
|
|||
|
|
2025-10-15 16:41:23 - файл сохранен во временную папку: /tmp/other_doc_0_1760535683.pdf
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Скачанные файлы:**
|
|||
|
|
1. ✅ 8_Договор_на_оказание_услуг...CTP#realfile.pdf
|
|||
|
|
2. ✅ 9_Подтверждение_оплаты...CTP#realfile.pdf
|
|||
|
|
3. ✅ 10_1_Скрин_личного_кабинета...CTP#realfile.pdf
|
|||
|
|
4. ✅ 11_1_Подтверждение_претензионной_работы...CTP#realfile.pdf
|
|||
|
|
5. ✅ 11_2_Подтверждение_претензионной_работы...CTP#realfile.pdf
|
|||
|
|
|
|||
|
|
### 🎯 Бонус: решена проблема ошибки 500!
|
|||
|
|
|
|||
|
|
Оказалось, что **ошибка 500 от прокси-сервера возникала из-за этих недостающих файлов**:
|
|||
|
|
- JSON указывал 21 файл, но реально отправлялось только 16
|
|||
|
|
- Система обнаруживала несоответствие и возвращала ошибку 500
|
|||
|
|
- После исправления все 21 файл загрузились → получен номер **41RS0001-201-25-0001140** ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Статус:** ✅ Проблема полностью решена и проверена на реальном проекте
|
|||
|
|
|