Маршрут для обслуживания статических ресурсов (например, .jpg и т. д.?)

StackOverflow https://stackoverflow.com/questions/531189

  •  22-08-2019
  •  | 
  •  

Вопрос

Я решил ряд интересных проблем с маршрутизацией — преобразование URL-адреса запроса в хеш и т. д., но просто из любопытства, есть ли способ сообщить системе маршрутизации, что вам нужно все, что попадает под определенный URL-адрес? подпуть, который будет обслуживаться буквально - без прохождения контроллера?

Например, если у меня есть /home/me/public_html/rails_proj/images/foo.jpg и .../rails_proj/images/other/bar.jpg, могу ли я вставить маршрут, в котором говорится: «Все, что находится под изображениями, должно быть просто служил объектом типа mime по умолчанию?"

Может быть интересно.

Это было полезно?

Решение

Если вы поместите каталог «images» в «общедоступную» папку приложения Rails (например:/public/images/), то у вас не должно возникнуть проблем с типами MIME, если только ваш веб-сервер не настроен неправильно.

Согласно вашим примерам, вы хотите, чтобы изображения находились в корне приложения.Я не думаю, что в Rails есть способ сделать эти изображения видимыми, но если вы действительно этого хотите, вы можете использовать mod_rewrite, чтобы это заработало.Еще раз, веб-сервер должен будет убедиться, что изображения имеют правильный тип MIME.

Другие советы

Вещи, которые обслуживаются из общедоступного каталога, не будут проходить через Rails - они будут просто обрабатываться вашим сервером (вероятно, Apache).Единственная причина, по которой вам понадобится передавать изображения через систему рельсов, — это если вам нужен какой-то контроль над тем, кто может получить к ним доступ.Просто выложите все остальное в общий доступ и получите доступ:siteurl.whatever/images/*.jpg

Обычно я использую nginx в качестве внешнего интерфейса и Apache/Passenger в качестве внутреннего.Ngingx передает все запросы Rails Apache, но сам обрабатывает весь статический контент.Посмотрите примеры на английская вики nginx.Вот небольшой отрывок из конфигурации nginx:

server {
    listen 80;
    server_name www.domain.com;
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|js)$ {
        root   /path/to/static/assets/dir;
    }
    location / {
        proxy_pass http://127.0.0.1:81;
    }
}

Поэтому пусть Apache прослушивает порт 81 для обработки запросов Rails, проксируемых nginx, и позволяет nginx доставлять статический контент.Предполагается, что nginx не только быстрее, чем Apache, доставляет статический контент, но также разгружает ваше приложение Rails для каждого изображения, таблицы стилей, javascript или любого другого статического контента.

Я думаю, что самый простой способ решить эту проблему — использовать вспомогательный метод image_path, который предоставит вам путь к изображению, которое вы хотите отобразить в представлении.Например, если вы хотите сослаться на файл logo.png в файле /assets/images/logo.png, вы можете просто использовать image_path('logo.png').

Предостережение:если URL-адрес вашего запроса соответствует статическому ресурсу, WEBrick, mongrel или что-то еще с радостью его обслужит.Любой ценой вам не нужно это в производстве:если ваш трафик достаточно высок, ваше приложение будет поставлено на колени только потому, что его ублюдки будут заняты обслуживанием статического контента.

Поэтому убедитесь, что ваш веб-сервер правильно настроен для всех видов статического контента, как указывали предыдущие комментаторы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top