如何将子域映射到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.dev
为store.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.dev
为store.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机器上创建子域路由的方法。 如果这也无法解决您的问题,那么还有另一种方法。