2010-04-04 28 views
12

Bạn có thể phân phối tệp tĩnh bằng Sinatra bằng cách đặt chúng trong public/ (theo mặc định) - Hiện tại tôi có một số index.html, nhưng làm cách nào để tạo điểm gốc cho tệp đó mà không cần phải phân tích cú pháp mẫu dưới dạng mẫu?Định tuyến trang tĩnh trong Sinatra (Ruby)

Để rõ ràng, tôi có thể truy cập thành công /index.html và tôi muốn định tuyến / thành cùng một tệp tĩnh nhưng không chuyển hướng. Bất kỳ ý tưởng làm thế nào để làm điều này?

Trả lời

18

Có lẽ một câu trả lời tốt hơn cuối cùng sẽ đến, cho đến lúc này đây là ảnh của tôi.

Nếu đây không phải là những gì bạn muốn:

get '/' do 
    redirect '/index.html' 
end 

Bạn có thể làm điều gì đó như thế này:

get '/' do 
    File.new('public/index.html').readlines 
end 

Tôi muốn đi với cái đầu tiên, mặc dù không chắc chắn lý do tại sao bạn muốn tránh chuyển hướng

+0

bầu cử cho các giải pháp đầu tiên. cũng nếu bạn sử dụng hành khách, điều này chỉ hoạt động. không yêu cầu định tuyến hoặc chuyển hướng. – rubiii

+1

@rubii Tôi nghĩ rằng nó sẽ là giá trị đặt cách hành khách trong câu trả lời riêng của nó. Điều đó có vẻ giống như một câu trả lời đúng hơn tôi –

+0

tôi nghĩ rằng câu trả lời của bạn là hoàn toàn tốt đẹp. tôi cá rằng JP không sử dụng hành khách. nhưng tôi sẽ đăng câu trả lời cho mọi người khác. – rubiii

3

sử dụng passenger điều này dường như hoạt động ngay lập tức. có tệp index.html trong thư mục công cộng và không có định tuyến nào trả về index.html khi truy cập url gốc.

6

Chỉ cần đặt enable :static bên trong lớp ứng dụng của bạn. Cũng giống như vậy:

class App < Sinatra::Base 
    # Set the app root; this is where the 'public' and 'views' 
    # directories are found (by default). 
    set :root, File.expand_path("#{File.dirname(__FILE__)}/../app") 

    # Allow the app to serve static files from the 'public' directory in :root 
    enable :static 
end 
3

Tôi nghĩ rằng đây chỉ là một vấn đề bởi vì Sinatra/rack không có khái niệm về một tập tin mặc định để phục vụ nếu bạn chỉ cần đi đến /. Trong một máy chủ web như Apache hoặc Nginx, việc này được thực hiện cho bạn và thường mặc định là index.html index.htm (nếu tồn tại, nó sẽ được phân phát khi truy cập thư mục không có tên tệp thực tế ở cuối).

Khi mọi người nói điều này được xây dựng thành Hành khách, tôi nghĩ họ thực sự có nghĩa là nó được tích hợp vào Apache/Nginx. Apache/Nginx sẽ kiểm tra xem tệp tĩnh có tồn tại và phục vụ nó không, yêu cầu đó sẽ không bao giờ đến Rack, điều này thật tuyệt vời cho hiệu năng.

Tôi không muốn thiết lập chuyển hướng đến trang 404 vì loại vi phạm toàn bộ ý tưởng HTTP này: nên có một điểm cuối cho mọi thứ mà điểm cuối sẽ trả lại trạng thái thực của điểm cuối đó. Có nghĩa là nếu bạn truy cập /asdf, bạn muốn máy chủ web báo cáo 404 vì đó là những gì thực sự xảy ra. Nếu bạn thực hiện chuyển hướng, bây giờ trang web của bạn đang nói "Tôi đã từng có thứ gì đó ở đây, nhưng nó đã di chuyển" và sau đó trang chuyển hướng bạn đến, mặc dù nó nói 404 trong văn bản trên trang, thực sự được báo cáo trên web máy chủ dưới dạng 200, có nghĩa là "mọi thứ đều ổn với trang này!"

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