【问题标题】:Production and staging api sub domains not working生产和登台 api 子域不起作用
【发布时间】:2014-09-12 19:14:06
【问题描述】:

我一直在 Rails 中开发一个 API,我希望可以通过 api.domain.com 访问它。在本地,我修改了我的/etc/hosts 文件,所以domain.comapi.domain.com 都解析为本地主机。对于暂存和生产,我为 api.domain.comapi.staging.domain.com 创建了 CNAME 别名,以指向它们各自的服务器 domain.comstaging.domain.com

在我的routes.rb 中,我所有的 api 路由都嵌套在其中

namespace :api, path: '/', defaults: { format: 'json' }, constraints: { subdomain: 'api' } do

当我向api.domain.com 发出请求时,它在本地工作得很好,但是当我尝试对生产和登台服务器执行相同操作时,我的请求失败,说它与路由不匹配,例如:

ActionController::RoutingError (No route matches [GET] "/v1/users/2/likes"):
  actionpack (4.1.4) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.1.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.1.4) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.1.4) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.1.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.1.4) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.1.4) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.1.4) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.1.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  activesupport (4.1.4) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
  rack (1.5.2) lib/rack/lock.rb:17:in `call'
  actionpack (4.1.4) lib/action_dispatch/middleware/static.rb:64:in `call'
  rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
  railties (4.1.4) lib/rails/engine.rb:514:in `call'
  railties (4.1.4) lib/rails/application.rb:144:in `call'
  rack (1.5.2) lib/rack/commonlogger.rb:33:in `call'
  rack (1.5.2) lib/rack/chunked.rb:43:in `call'
  rack (1.5.2) lib/rack/content_length.rb:14:in `call'
  unicorn (4.8.3) lib/unicorn/http_server.rb:576:in `process_client'
  unicorn (4.8.3) lib/unicorn/http_server.rb:670:in `worker_loop'
  unicorn (4.8.3) lib/unicorn/http_server.rb:525:in `spawn_missing_workers'
  unicorn (4.8.3) lib/unicorn/http_server.rb:140:in `start'
  unicorn (4.8.3) bin/unicorn:126:in `<top (required)>'

【问题讨论】:

  • domain.com 中是否有其他 Rails 应用程序正在运行?如果是这样,您的网络服务器是否配置为将请求转发到适当的应用程序?
  • 该域上只有 1 个应用程序。而且我只为 api.* 创建了 CNAME 别名,以指向您在我的 routes.rb 文件中看到的相应服务器和配置。
  • 我不确定您的生产环境,但对于您的暂存环境,它可能无法正常工作。根据路由指南,约束可以是请求对象接受的任何方法,并返回String,如subdomain。根据该方法的文档api.rubyonrails.org/classes/ActionDispatch/Http/…,该方法将返回api.staging,而不是您在路线中所期望的api
  • 在 staging 环境中,它解析为 api.staging 是完全可以的,但在生产环境中,它都无法正常工作。
  • 我正在尝试做同样的事情,是的,子域解析为“api.staging”......这不是我真正想要的:/

标签: ruby-on-rails api subdomain unicorn


【解决方案1】:

这个怎么样?

# inline
constraints: { subdomain: /api(?:\.(staging))?/ }


# config/routes.rb

# API Routes
constraints subdomain: /api(?:\.(staging))?/ do
  ...
end

以上将匹配:api.example.comapi.staging.example.com

您也可以轻松地添加其他人,例如。

# config/routes.rb

# API Routes
constraints subdomain: /api(?:\.(staging|other))?/ do
  ...
end

以上将匹配:api.example.comapi.staging.example.comapi.other.example.com

【讨论】:

  • 我知道我迟到了 2 年,现在正在从事另一个项目,但我用它来进行暂存,它工作正常,但生产仍然无法工作。我认为这是 DNS 问题或其他问题。
  • 您是否在暂存和生产中都通过 https 为您的应用程序提供服务,如果是,您是否使用相同的 SSL 证书?我只是想知道您是否需要通配符 SSL 证书。
  • 是的,我认为这也可能是问题所在,我们的网站有 https,但 api 端点似乎没有。暂存没有 https 并且工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多