Ruby on rails 基于用户会话使用Rails服务静态网站

Ruby on rails 基于用户会话使用Rails服务静态网站,ruby-on-rails,Ruby On Rails,是否可以基于用户登录(以用户为中心的路由)将用户路由约束从Rails 3/4发送到服务器完整的网站?我大概在考虑将不同的静态网站放在应用程序的子目录中,让用户可以在主根目录下访问它们(通过登录进行保护) 如果没有用户登录,则使用简单的登录掩码来识别用户,例如使用Desive。我在考虑简化静态页面的登台部署,例如,使用中间人生成的页面。最好有一个简单的capistrano任务来部署到rails应用程序中,而不是创建子域、ftp上载等 在/下安装静态页面的原因是,大多数静态站点生成器都希望页面在/下

是否可以基于用户登录(以用户为中心的路由)将用户路由约束从Rails 3/4发送到服务器完整的网站?我大概在考虑将不同的静态网站放在应用程序的子目录中,让用户可以在主根目录下访问它们(通过登录进行保护)

如果没有用户登录,则使用简单的登录掩码来识别用户,例如使用Desive。我在考虑简化静态页面的登台部署,例如,使用中间人生成的页面。最好有一个简单的capistrano任务来部署到rails应用程序中,而不是创建子域、ftp上载等

在/下安装静态页面的原因是,大多数静态站点生成器都希望页面在/下,我希望避免资产中的绝对/相对路径出现问题

更具体地说:

案例1)用户未登录->任何路由请求验证

案例2)用户已登录,静态内容由/app/sites/site1提供(安装在“/”)

案例3)另一个用户已登录,静态内容由/app/sites/site2提供(安装在“/”)


所服务的网站取决于用户档案。

回答我自己的问题:是的,这是可能的

在我的例子中,Rails并没有过度使用。我与基于Rails的项目管理系统实现了无缝集成。我正在将一个应用程序安装为web服务器,根据用户会话使用不同的公共url。会话是通过唯一令牌生成的,因此用户可以一个接一个地查看不同的静态项目

routes.rb:

constraints(:subdomain => /preview/) do
    mount SinatraWrapper => "/"
end
注意:我在这里使用约束来检查子域。每个静态预览都会重定向到不同子域下的同一个应用程序

西纳特拉包装:

# a super-trivial Sinatra-based webserver
# for static content
require 'sinatra/base'

class SinatraWrapper < Sinatra::Base
  before '/*' do
    SinatraWrapper.set_site(session[:site])
  end

  def self.set_site(site)
    rootPath = File.expand_path("#{Rails.root}/sites/#{site}/")
    set :public_folder, "#{rootPath}/current/build/"
  end

  configure do
    set :static, true
    set :static_cache_control, [:public, :no_store, :no_cache, :must_revalidate, :max_age => 0, :expires => "Fri, 01 Jan 1990 00:00:00 GMT"]
  end

  set_site("default")

  # route to starting page (index.html)
  get "/" do
    redirect "/index.html"
  end

  # route to custom error page (404.html)
  not_found do
    redirect "/404.html"
  end

end
注意:我有很多静态页面的项目。我们对平台中的每个静态页面都有一个预览操作。如果您使用平台表单中的链接点击预览操作,您将被重定向到预览子域并设置会话。我们的身份验证允许我们

  • 向客户发送带有身份验证令牌(SHA slug)的匿名链接
  • 并通过数据库进行身份验证
我们使用这个系统已经半年了,非常满意!客户可以立即查看预览。到目前为止,我们还没有遇到任何严重的问题,除了必须正确设置缓存头以确保每次重新加载页面时都加载新内容。这减慢了体验的速度,但我们总是可以争论,这是一个预览。老实说,大多数客户都不知道装载时间

无论如何,我不能100%确定我的“崩溃”缓存的实现是否是完美的解决方案。任何暗示都将不胜感激。我只在Chrome和Safari(非常罕见)中遇到问题,在显示新内容之前,您需要多次重新加载页面

另一个有趣的问题是安全性。我觉得比较安全。但我不是安全专家。有什么顾虑吗


我们只在内部使用这个平台。没有产品,因此我们不会非常温和地处理错误。

请添加更多信息。一个具体的例子会很好。有几种方法可以解决这个问题。我想知道Rails是不是太夸张了,也许你应该考虑一下像西纳特拉这样的问题:你能澄清这个问题吗?
# static_pages_controller.rb:

def preview

    if request.subdomain == "preview" or Rails.env.development? # local dev: no subdomains
      @static_page = StaticPage.find(params[:id])
      session[:site] = @static_page.slug || "default" # using a sha-slug for every static project
      redirect_to "/" # redirect to root. we have a valid session now.
    else
      # we are NOT on the preview subdomain, so we need to redirect to proper subdomain
      @project = Project.find(params[:project_id])
      @static_page = StaticPage.find(params[:id])
      redirect_to preview_url(project_id: @project.id, id: @static_page.id, token: @static_page.slug).sub("plattform", "preview")
    end
end