2009-02-10 33 views
14

Tôi đã làm việc theo một số vấn đề định tuyến thú vị - chuyển URL yêu cầu thành băm, v.v ... nhưng chỉ tò mò, là có một cách để nói với hệ thống định tuyến mà bạn muốn bất cứ điều gì mà đi theo một subpath url nhất định để được phục vụ theo nghĩa đen - mà không đi qua một bộ điều khiển?Đường ray: Tuyến đường để phân phát nội dung tĩnh (như .jpgs, v.v?)

Ví dụ: nếu tôi có /home/me/public_html/rails_proj/images/foo.jpg và .../rails_proj/images/other/bar.jpg, tôi có thể chèn tuyến đường cho biết "bất kỳ điều gì theo hình ảnh chỉ nên được phân phát dưới dạng đối tượng của loại mime mặc định? "

Có thể thú vị.

Trả lời

15

Nếu bạn đặt thư mục "hình ảnh" vào thư mục "công khai" của ứng dụng Rails (ví dụ:/public/images /) thì bạn không nên gặp sự cố với loại MIME trừ khi máy chủ web của bạn được định cấu hình sai .

Theo ví dụ của bạn, bạn muốn thư mục hình ảnh trong thư mục gốc của ứng dụng. Tôi không nghĩ rằng có một cách mặc dù Rails để làm cho những hình ảnh có thể nhìn thấy, nhưng nếu bạn thực sự muốn bạn có thể sử dụng mod_rewrite để làm cho nó hoạt động. Một lần nữa, nó sẽ được lên đến máy chủ web để đảm bảo hình ảnh có loại MIME chính xác.

+0

Tôi ổn với việc di chuyển hình ảnh vào thư mục công khai. Tôi sẽ làm một số googling xung quanh - đặt tài sản vẫn còn cho tôi một "Không có tuyến đường phù hợp ............. với {: method =>: get} – Sniggerfardimungus

+1

Vấn đề với thư mục công cộng là Tôi đã thử url/public/... Tôi đã xóa bỏ việc sử dụng rõ ràng/public/và nó hoạt động tốt. – Sniggerfardimungus

+0

Nó tấn công tôi rằng một lý do để làm điều này trực tiếp trong đường ray là dành cho trường hợp bạn đang chạy một sự phát triển Đó là nói rằng, đặt chúng dưới công chúng dường như làm việc cho tôi.) – lindes

6

Những thứ được phân phối ra khỏi thư mục công cộng sẽ không đi qua Rails - chúng sẽ chỉ được máy chủ của bạn xử lý (có thể là apache). Lý do duy nhất tại sao bạn sẽ cần phải phục vụ hình ảnh thông qua hệ thống đường ray là nếu bạn muốn một số loại kiểm soát về những người có thể truy cập chúng. Chỉ cần đặt mọi thứ khác ở nơi công cộng và truy cập ala: siteurl.whatever/images/*. Jpg

+0

Nó cho tôi biết rằng lý do chính người ta có thể muốn đường ray để phục vụ hình ảnh trực tiếp là trên một máy chủ phát triển khi chạy chỉ đơn giản là kịch bản/máy chủ. – lindes

1

Lưu ý: nếu URL yêu cầu của bạn khớp với tài nguyên tĩnh WEBrick, mongrel hoặc bất kỳ thứ gì vui vẻ sẽ phục vụ. Bất cứ giá nào, bạn không muốn điều này trong sản xuất: nếu lưu lượng truy cập của bạn đủ cao, ứng dụng của bạn sẽ được đưa đến đầu gối của nó chỉ vì mongrels của nó sẽ bận rộn phục vụ nội dung tĩnh.

Vì vậy, hãy đảm bảo rằng máy chủ web của bạn được định cấu hình đúng cho tất cả các loại nội dung tĩnh như các bình luận trước đã chỉ ra.

5

Tôi thường sử dụng nginx làm giao diện người dùng và Apache/Hành khách làm phụ trợ. Ngingx proxy tất cả các yêu cầu Rails cho Apache nhưng xử lý tất cả các nội dung tĩnh. Xem các ví dụ trên the English nginx wiki. Dưới đây là một trích đoạn nhỏ cho cấu hình 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; 
    } 
} 

Vì vậy, hãy apache nghe trên cổng 81 để xử lý Yêu cầu đường ray của nginx và cho nginx cung cấp nội dung tĩnh. Không chỉ nginx được cho là nhanh hơn Apache khi cung cấp nội dung tĩnh, nhưng điều này cũng giảm tải ứng dụng Rails của bạn cho mọi hình ảnh, biểu định kiểu, javascript hoặc bất kỳ nội dung tĩnh nào khác.

2

Tôi nghĩ cách đơn giản nhất giải quyết vấn đề này là sử dụng phương pháp trợ giúp image_path, cung cấp cho bạn đường dẫn cho hình ảnh bạn muốn hiển thị trong giao diện. Ví dụ: nếu bạn muốn tham chiếu logo.png trong /assets/images/logo.png, bạn chỉ có thể sử dụng image_path ('logo.png').

Các vấn đề liên quan