私自身の質問に答えるには:はい、可能です。
私の場合、Rails はやり過ぎではありません。Rails ベースのプロジェクト管理システムとシームレスに統合しています。ユーザー セッションに基づいて別のパブリック URL を使用して、 Sinatra -App を Web サーバーとしてマウントしています。セッションは一意のトークンを介して生成されるため、ユーザーはさまざまな静的プロジェクトを次々と表示できます。
ルート.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
注: カピストラーノ経由で静的プロジェクトから更新を Rails アプリにデプロイしています。ビルドはMiddlemanを介してリモートで実行されます(ここでは他の静的サイト ジェネレーターを使用できます)。別のインスタンスは、「プレビュー」ブランチで git リポジトリの更新をチェックし、そこでテストを実行します。すべてのテストに合格すると、ビルドが実行され、自動的にデプロイされます。
2 つの異なるサブドメインに対して異なる動作を使用するが、同じセッションを使用するというトリッキーなビットがあります。
# 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
注: 私は多くの静的ページを含むプロジェクトを持っています。プラットフォームからのすべての静的ページのプレビュー アクションがあります。プラットフォームからのリンクでプレビュー アクションをヒットすると、プレビュー サブドメインにリダイレクトされ、セッションが設定されます。私たちの認証により、
- 認証トークン (SHA-Slugs) を含む匿名リンクを顧客に送信する
- データベース経由で認証する
私たちはこのシステムを半年間使用していますが、とても満足しています! お客様はすぐにプレビューを見ることができます。ページをリロードするたびに新しいコンテンツが読み込まれるように、キャッシュ ヘッダーを正しく設定する必要があることを除いて、これまでのところ重大な問題は発生していません。これによりエクスペリエンスが遅くなりますが、これはプレビューであると常に主張できます. 正直なところ、ほとんどの顧客はロード時間を認識していません。
とにかく、キャッシュを「クラッシュ」させるための実装が完璧な解決策であるかどうかは 100% 確信が持てません。どんなヒントでも大歓迎です。新しいコンテンツが表示されるまでページを数回リロードする必要がある Chrome と Safari (非常にまれ) でのみ問題が発生します。
もう 1 つの興味深い質問は、セキュリティです。比較的安全だと思います。しかし、私はセキュリティの専門家ではありません。懸念事項はありますか?
このプラットフォームは社内でのみ使用します。非常に丁寧なエラー処理を行っておりますので商品の間違いはございません。