我有一个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>
有人知道我做错了吗?
答案 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
请求更新您的问题