この場合、サブドメインまたはサブドメインなしに基づいてルーティングを制限しました。その場合、サブドメインでのみ機能するルートを簡単に作成でき、誰かがサブドメインなしで同じルートにアクセスしようとすると、ルーティング エラー (404) が発生します。
たとえば、次のようになります。
ルート.rb
Backend::Application.routes.draw do
constraints AppDomainRoutes.new do
# signup paths
get "/signup" => "accounts#new", as: "signup"
post "/signup" => "accounts#create", as: "signup"
# root
root to: "accounts#new"
end
constraints AccountDomainRoutes.new do
# password reset paths
get "/reset_password/:password_reset_token" => "reset_passwords#edit", as: "reset_user_password"
put "/reset_password/:password_reset_token" => "reset_passwords#update", as: "reset_user_password"
# websites
resources :websites
# root
root to: "websites#new"
end
# request password reset paths
get "/reset_password" => "reset_passwords#new", as: "reset_password_request"
post "/reset_password" => "reset_passwords#create", as: "reset_password_request"
# login paths
get "/login" => "sessions#new", as: "login"
post "/login" => "sessions#create", as: "login"
# logout paths
get "/logout" => "sessions#destroy", as: "logout"
delete "/logout" => "sessions#destroy", as: "logout"
end
そして、lib/routes で:
app_domain_routes.rb
class AppDomainRoutes
def matches?(request)
request.subdomain.blank? || request.subdomain == "www"
end
end
account_domain_routes.rb
class AccountDomainRoutes
def matches?(request)
request.subdomain.present? && request.subdomain != "www"
end
end
現在、/signup
メイン アプリケーション ドメインwww.mydomain.com または mydomain.comからの/websites/new
みアクセスでき、*.mydomain.comからのみアクセスできます。ただし/login
、便宜上、両方の状況で引き続きアクセスできます。
明らかに、実際にはデータベース内のアカウントではないinvalid.mydomain.com
場合、これは訪問の問題を解決しません。invalid
このために、次のように に戻り、application_controller.rb
そこでリダイレクトを処理します。
application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :redirect_unknown_account
private
# returns current subdomain (account.subdomain) or nil
def account_subdomain
@account_subdomain ||= request.subdomain if request.subdomain.present? && request.subdomain != "www"
end
def current_account
@current_account ||= Account.find_by_username(account_subdomain) if account_subdomain
end
def redirect_unknown_account
if account_subdomain && ! current_account
redirect_to signup_url(host: app_domain), alert: "This account does not exist."
end
end
def account_domain
@account_domain ||= "#{current_account.username}.#{app_domain}" if current_account
end
def app_domain
@app_domain ||= "mydomain.com"
end
end