如何将子域映射到localhost中的现有控制器操作

我想为这个特定的路线设置一个子域

get 'product_list/home' 

以前url曾经像localhost:3000/product_list/home 。 现在我希望url为store.dev:3000/product_list/home

我修改了这样的路线

  constraints subdomain: 'store' do get 'product_list/home' end 

在/ etc / hosts中。 我添加了store.dev如下

 127.0.0.1 localhost 127.0.0.1 store.dev 

但是当在开发环境中访问store.dev:3000时,我的主页就像localhost:3000

但我想将我的子域限制为仅此路由product_list/home

我面临的另一个问题是

http://store.dev:3000/product_list/home当我访问这个时

我得到了这个

 No route matches [GET] "/product_list/home" 

更新:

更改hosts文件中的条目..从store.devstore.local.dev它可以访问store.local.dev:3000/product_list/home. 但我的问题是我也可以访问其他页面,比如说我有about页面的信息。 store.local.dev:3000/about ,但我不希望这种情况发生。 如何将子域限制为仅一个特定路由

您的示例和大多数其他答案中的示例实际上根本不使用子域:如果您查看域名store.dev那么它实际上没有子域, store.dev是顶级域/根域。 子域的示例是: sub.store.dev

如果您将/ etc / hosts文件中的条目从store.devstore.local.dev那么您的代码将起作用。

更新

要回答问题的第二部分(将路由限制为仅根域):您可以通过在另一个具有空子域的constraints块中包装仅在根域上可用的路由来实现此目的:

 constraints subdomain: '' do get '/about' end 

您的路线文件代码是正确的

constraints subdomain: 'store' do get 'product_list/home' end

为了测试localhost使用以下url,无需在主机文件store.lvh.me:3000进行更改

lvh.me是使用127.0.0.1映射的虚拟域名

https://reinteractive.net/posts/199-developing-and-testing-rails-applications-with-subdomains

我认为您还需要将子域添加到/ etc / hosts文件中:

 127.0.0.1 dev items.dev 

尝试将通配符子域添加到/ etc / hosts:

 127.0.0.1 *.dev 

或者,只需导航到http://items.lvh.me 。 (此域的所有者将域和子域的所有DNS请求指向当前的127.0.0.1)

此外,您可能需要在启动服务器时绑定到正确的接口,因为127.0.0.1并不严格等同于localhost(默认情况下rails服务器绑定的位置):

 rails s -b 127.0.0.1 

要么

 rails s -b 0.0.0.0 # all interfaces 

请注意,后者可能被视为不安全,因为它将您的开发服务器暴露给您的本地网络。

我正在添加另一个答案,因为问题已经从原来的问题发生了变化,而我现有的答案已经不再适用了。

要确保您的子域store.domain.dev只有一个可用路由,您还需要将其余路由包装在约束块中:

 # this matches store.domain.dev constraints subdomain: 'store' do get '/product_list/home' # add a redirect for the root path so you don't get a 404 # when browsing to store.domain.dev (optional) root '/', to: redirect('/product_list/home') end # this matches no subdomain and 'www' subdomain (ie domain.dev and www.domain.dev) constraints subdomain: /^(|www)$/ do # put ALL your other routes here # .. # root '/', to: 'home#index' end 

对于问题的第二部分,您应该尝试使用domain.dev而不仅仅是dev ,否则可能会错误地解释子域。

此外,您应该使用get '/product_list/home'而不是像Rails路由指南中指定get 'product_list/home'那样get 'product_list/home' : http : //guides.rubyonrails.org/routing.html

来自Docs :

基于请求的约束

您还可以基于Request对象上返回String的任何方法来约束路由。

您指定基于请求的约束的方式与指定段约束的方式相同:

get 'photos', to: 'photos#index', constraints: { subdomain: 'admin' }

您还可以以块forms指定约束:

 namespace :admin do constraints subdomain: 'admin' do resources :photos end end 

更新:

我发现这个链接提供了一种在dev机器上创建子域路由的方法。 如果这也无法解决您的问题,那么还有另一种方法。