Rails 4路由子域约束

时间:2014-09-19 05:58:40

标签: ruby-on-rails apache routes subdomain passenger

我有一个rails应用程序在开发模式下工作,路由配置如下:

  scope module: :web do
    resources :locations
  end


  constraints subdomain: "api" do
    scope module: :api do
      resources :locations
    end
  end

这在启动rails服务器并分别使用www.lvh.me:3000和api.lvh.me:3000时有效。但是,当使用apache和passenger在生产中运行时,这会失败,从而ActionController::RoutingError (No route matches [GET] "/locations") 访问任一域时出错。

我的apache vhost配置文件如下所示:

<VirtualHost *:80>
    ServerName server.XYZ.co.uk
    ServerAlias *.XYZ.co.uk

    DocumentRoot /myapp/current/public

    <Directory /myapp/current/public>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

有人知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

<强>路线

我当然希望删除www约束 -

#config/routes.rb
constraints subdomain: "api" do
   scope module: :api do
     resources :locations
   end
end

scope module: :web do
   resources :locations
end

除非您尝试从“www”子域提供您的应用,否则您将更好地将路由视为整个应用程序,使用约束来指定单个元素

-

<强>的Apache

您还需要确保Apache / Passenger正确捕获您的子域名:

#etc/apache2/apache2.conf
VirtualHost *:80>
    ServerName XYZ.co.uk
    ServerAlias www.XYZ.co.uk

    DocumentRoot /myapp/current/public

    <Directory /myapp/current/public>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

您需要记住的是,当您向Rails应用程序发送请求时,它将采用浏览器提供的任何约束,并呈现相应的路由。在这种情况下,Apache仅仅是一个网关 - 一种连接HTTP请求和后端应用程序的方法。

您应该尽可能多地使用Rails路由系统 - 这意味着您应该保留apache conf文件以传递请求,而不是尝试处理/路由它。

具体来说,我认为您不需要在Apache配置文件中指定api子域。你最好将流量传递给Rails本身

-

<强>滑轨

最后,你提到你收到了no route matches错误 - 你将能够在Rails日志中查看Apache实际上的请求

我想你的应用程序要么没有通过正确的约束,要么服务器的设置不正确。你可能想要确保你的路线&amp; Apache配置如上设置,然后使用Rails receive

请求更新您的问题