Лучший способ сделать это - написать простую библиотеку промежуточного программного обеспечения для стойки, которая переписывает заголовки запросов так, чтобы приложение rails получало ожидаемый вами URL, но с точки зрения пользователя URL не меняется. Таким образом, вам не нужно вносить какие-либо изменения в ваше приложение rails (или файл маршрутов)
Например, библиотеку стойки переписывают: users.example.com => example.com/users
Этот камень должен сделать именно то, что вам нужно: http://github.com/jtrupiano/rack-rewrite
ОБНОВЛЕНО КОДОВЫМ ПРИМЕРОМ
Примечание: это написано быстро, полностью не проверено, но должно поставить вас на правильный путь. Кроме того, я не проверил гем перезаписи стойки, который мог бы сделать это еще проще
# your rack middleware lib. stick this in you lib dir
class RewriteSubdomainToPath
def initialize(app)
@app = app
end
def call(env)
original_host = env['SERVER_NAME']
subdomain = get_subdomain(original_host)
if subdomain
new_host = get_domain(original_host)
env['PATH_INFO'] = [subdomain, env['PATH_INFO']].join('/')
env['HTTP_X_FORWARDED_HOST'] = [original_host, new_host].join(', ')
logger.info("Reroute: mapped #{original_host} => #{new_host}") if defined?(Rails.logger)
end
@app.call(env)
end
def get_subdomain
# code to find a subdomain. simple regex is probably find, but you might need to handle
# different TLD lengths for example .co.uk
# google this, there are lots of examples
end
def get_domain
# get the domain without the subdomain. same comments as above
end
end
# then in an initializer
Rails.application.config.middleware.use RewriteSubdomainToPath