Rails: изображение существует, но не отображается в производстве, даже если отображается в разработке - PullRequest
3 голосов
/ 02 марта 2020

Есть похожие вопросы, такие как это , это , это и это , но они не решают проблему.

У нас есть локально сохраненное изображение, которое отображается в среде разработки.

Однако на производстве изображение не отображается. Доступ к URL-адресу изображения из браузера перенаправляется на страницу 404, потому что изображение по какой-то причине не найдено. Другие изображения в этом же каталоге отображаются без проблем.

Подробности: -

  • URL-адрес изображения 1: https://test.com/designs/thumbnails/foo/bar1.jpg

  • URL-адрес изображения 2: https://test.com/designs/thumbnails/foo/bar2.jpg

  • Ввод обоих URL-адресов изображений непосредственно в браузер дает разные результаты. Изображение 1 будет отображаться, а изображение 2 - нет. Изображение 2 перенаправляет на страницу 404.

  • Это не проблема кэширования, рендеринг в режиме инкогнито завершается.

  • Оба изображения существуют в directory.

  • Это, кажется, происходит для новых изображений, хотя шаблон не ясен (т. е. некоторые новые изображения отображаются, но не все делают).

  • Код рендеринга изображения: <img class="thumbnail" src="<%= design["thumbnailURL"] %>">, где design["thumbnailURL"] - это относительный URL-адрес изображения (который, да, существует).

  • Мы используем Rails 3.2 и Cloudflare .

  • Стек сервера:

    • Версия приложения для пассажиров: 6.0.2
    • Экземпляр: ElIQgS48 (nginx / 1.15.8 Phusion_Passenger / 6.0 .2)
    • Ruby версия: ruby 2.1.2p95
    • Операционная система: CentOS Linux выпуск 7.6.1810 (Core)
    • PHP 7.0 .33
    • Версия сервера: 5.5.60-MariaDB Сервер MariaDB
    • Postfix mail_version = 2.10.1
    • Версия Dovecot: 2.2.36 (1f10bfa63)

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Если вы размещаете свои файлы в папке publi c и не используете конвейер ресурсов, часто веб-сервер HTTP (apache, nginx ...) часто обслуживает stati c файлы. непосредственно. Они делают это хорошо и быстро.

Пожалуйста, дайте более подробную информацию о настройке вашего производственного хостинга (веб-сервер, config и c), а также URL, сгенерированные Rails для ваших изображений. Я обновлю ответ соответствующим образом с соответствующей конфигурацией веб-сервера, чтобы ваши stati c файлы обслуживались напрямую.

1 голос
/ 12 марта 2020

Я только что посмотрел на ваш пример https://www.test.com/designs/thumbnails/foo/bar1.jpg, а затем я проверил ваш тег изображения и увидел <img src="img/test.com-logo.png" alt="Test.com create tests"> Я смог обновить его до <img src="/img/test.com-logo.png" alt="Test.com create tests">, и я смог увидеть ваш lo go.

вы можете обновить свой эрб с <img class="thumbnail" src="<%= design["thumbnailURL"] %>"> до <img class="thumbnail" src="/<%= design["thumbnailURL"] %>"> или вы можете убедиться, что включили "/" в значение для design["thumbnailURL"] Я надеюсь, что это поможет

0 голосов
/ 06 марта 2020

Используете ли вы конвейер активов? если да, сначала выполните прекомпиляцию с помощью

RAILS_ENV=production rails assets:precompile

, затем попробуйте

# attempt 1
<img class="thumbnail" src="<%= 'assets/' + design["thumbnailURL"] %>">
# because the images would be compiled and under public/assets/
# I don't know exactly what's design["thumbnailURL"] contain, so I list this attempt

# attempt 2
<%= image_tag design["thumbnailURL"], alt: '...', class: 'thumbnail' %>
# image_tag will also append SHA256 suffix in the filename
# in production environment, all the assets will be appended a SHA256 to let the browser know its the latest assets, ex: aaa.jpg will be aaa-908e25f4bf641868d8683022a5b62f54.jpg, it may be the cause the browser cannot find the right one and return 404

# attempt 3
# if you don't want the images being precomiled, just put original images under public/ rather than app/assets/images/
# design["thumbnailURL"] should be the relative path to public/
# and you can remain your <img ...> same in view
# however, if you update the image, the users who already have been to your site would cache the old image and your new image will not be shown on their browser

развернуть новый код и посмотреть, работает ли он

...