Проблема в том, что CDN получает некорректное поведение, чего вы явно не хотите. Работает корректно только не-CDN: при нажатии на «скачать» что-то действительно скачивается.
Ага, да, тогда нужно исправить.
Справедливо. Есть ли какие-либо примеры настройки лайтбокса, которые я мог бы использовать в качестве отправной точки?
Это совсем не подвержено взлому, что подтверждается:
Вам нужно изучить документацию по Magnific Popup: Responsive jQuery Lightbox Plugin и проверить, можно ли как-то перенастроить её на лету.
Обидно, я попробую что-нибудь придумать.
Просто из любопытства — почему Discourse выбирает действие «скачать» вместо «просмотреть в полном размере» здесь? С точки зрения пользователя, кажется, что просмотр в полном размере — более частое действие?
Я думал, что это проблема с MIME, но, судя по заголовку, дело может быть в:
x-download-options: noopen
Это предотвращает открытие файла при загрузке. Надеюсь, Сэм сможет прояснить ситуацию.
Это решение @codinghorror, я полагаю, что так можно чисто сохранить оригинальное имя загруженного файла, что важно некоторым пользователям. Кроме того, похоже, что Flickr тоже так делает.
Я не думаю, что мы будем что-то менять в этом, мы просто настроим приложение для проксирования через специальный маршрут или что-то в этом роде. Количество пользователей, нажимающих «скачать», ничтожно мало, поэтому обход CDN может быть приемлем здесь. В любом случае @pmusaraj сможет определить наилучшее решение. Насколько я понимаю, нам либо нужно попросить AWS предоставить подписанный URL со специальным заголовком Content-Disposition, либо проксировать файл. В обоих случаях потребуется обход CDN S3. Если мы будем проксировать через приложение, то хотя бы сможем использовать CDN приложения.
После небольшого дополнительного чтения выяснилось, что за такое поведение отвечают content-disposition: attachment; и x-download-options: noopen.
Понимаю, что это объяснение того, как это работает, а не почему. Однако, если это сделано в целях безопасности, всё абсолютно логично.
Этот PR должен исправить это следующим образом:
- добавление атрибута
data-download-hrefк ссылке на загрузку в лайтбоксе, когда включена загрузка в S3; - используемый URL — новая схема коротких URL с параметром
dl=1, благодаря которому контроллер генерирует подписанный URL S3 с правильным заголовком content-disposition и именем файла.
Другими словами, ссылка на загрузку в лайтбоксе теперь будет выглядеть как /uploads/short-url/mTGbg4Ld2iBYAbfTvEjGXP2LtVm.pdf?dl=1, которая будет перенаправлять на подписанный URL S3 с заголовком content-disposition: "attachment; filename=original.png".
Я считаю, что это самый простой и прямой вариант. Проксирование через приложение было бы немного менее эффективным, так как загружаемый файл должен был бы проходить путь от S3 к серверу Discourse, а затем к клиенту.