【问题标题】:How to map a subdomain to an existing controller action in localhost如何将子域映射到 localhost 中的现有控制器操作
【发布时间】:2016-07-21 15:02:35
【问题描述】:

我想为这条特定路线创建一个子域

   get 'product_list/home'

以前的网址是localhost:3000/product_list/home。现在我希望网址是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"

更新:

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

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

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

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

更新

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

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

【讨论】:

  • 嗨@severin,您解决了我的一个问题,即我能够导航到 store.local.dev:3000/product_list/home。但我面临的另一个问题是我想将此子域 store 限制为仅 product_list/home。我应该无法导航到 store.local.dev:3000/home .. 那是我的主页所在的位置。现在我可以导航了。
  • @gates 我更新了我的答案,也回复了你的第二个问题
  • 非常感谢,我无法在接下来的 4 小时内奖励赏金。我会这样做,一旦我被允许奖励,请指出一些关于子域路由的有用资源。
【解决方案2】:

您的路线文件代码正确

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

【讨论】:

    【解决方案3】:

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

    127.0.0.1   dev items.dev
    

    【讨论】:

    • 我的意思是不要有一个指向 items.dev:3000 的主页,而是 items.dev:3000 应该指向 items#index 操作。
    【解决方案4】:

    尝试将通配符子域添加到 /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
    

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

    【讨论】:

    • 将像 127.0.0.1 这样的子域添加到 items.dev 并导航到 items.dev:3000 工作正常。但我不希望所有页面都有这个子域,我只想让这个特定页面有子域。我在 / 中配置了主页。现在这部分应用程序也需要在 / 所以去子域是我唯一的选择。
    • 那你应该把你的路由改成:get '/' => 'items#index' , constraints: {subdomain: 'items'}'
    • 没关系。您可以有两个 get / 作为其中一个具有子域约束。只需确保文件中具有子域约束的​​路由较高,以便首先匹配它。
    • 嗨,请最后看看我的问题。我很抱歉编辑大部分问题
    【解决方案5】:

    我正在添加另一个答案,因为问题已与原来的不同,我现有的答案不再相关。

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

    # 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 (i.e. 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'http://guides.rubyonrails.org/routing.html

    【讨论】:

      【解决方案6】:

      来自Docs

      基于请求的约束

      您还可以根据任何 Request 对象上返回字符串的方法。

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

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

      您还可以以块的形式指定约束:

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

      更新:

      我找到了this link,它提供了一种在开发机器上创建子域路由的方法。如果这也不能解决您的问题,还有另一种方法here

      【讨论】:

      • 你的服务器配置在哪里?您是否已将子域映射为从项目目录中提供文件?
      • 否决解决您的问题的尝试根本无济于事。你想在这里做什么和你做了什么是两件不同的事情。请给我们一个帮助你的机会。您使用的是哪个版本的 Rails?
      • 你好 stable_daddy,我没有投反对票 .. 为什么我要投反对票的人,谁想帮助我?但是其他一些高级 SO 人应该这样做,因为您的回答表明您没有阅读该问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多