Rails 4子域名在生产环境下无法工作

4
我已经创建了一个带有三个子域的Rails 4应用程序。
开发域名:
- mydomain.dev - api.mydomain.dev - account.mydomain.dev
生产域名 (使用Nginx和Passenger):
- app.mydomain.com (www.mydomain.com和mydomain.com显示其他页面,而不是该应用程序) - api.mydomain.com - account.mydomain.com
我的config/routes.rb看起来像这样:
Rails.application.routes.draw do
    namespace :api, constraints: { subdomain: 'api' }, path: '/', defaults: { format: :json } do
        namespace :v1 do
            resources :clients, only: [:create, :show]
        end
    end

    namespace :account, constraints: { subdomain: 'account' }, path: '/' do
        get '/:locale' => 'welcome#index', locale: /en|pt/
        root 'welcome#index'

        scope "(:locale)", locale: /en|pt/ do
            get :sign_in, to: 'sessions#new'
            post :sign_in, to: 'sessions#create'
        end
    end

    get '/:locale' => 'welcome#index', locale: /en|pt/
    root 'welcome#index'

    scope "(:locale)", locale: /en|pt/ do
        resource :session, only: [:new, :create, :destroy]
        get :login, to: 'sessions#new', as: :login
    end
end

我的ngnix虚拟主机文件:
server {
    listen 80;
    listen [::]:80;

    # SSL configuration
    #
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name mydomain.com api.mydomain.com account.mydomain.com;

    passenger_enabled on;
    passenger_ruby /home/username/.rvm/gems/ruby-2.2.2@myapp/wrappers/ruby;

    root /var/sites/mydomain.com/current/public;

    ssl on;
    ssl_certificate /etc/nginx/ssl/mydomain.com/server.crt;
    ssl_certificate_key /etc/nginx/ssl/mydomain.com/server.key;
}

我遇到的问题是,在我的开发机(本地环境)或开发环境上都能够很好地工作,但是在生产环境上却出现了错误:The page you were looking for doesn't exist.,并且有以下日志信息:

访问:https://account.mydomain.com/en/sign_in

I, [2015-07-29T11:31:07.197635 #25813] INFO -- : Started GET "/en/sign_in" for 0.0.0.0 at 2015-07-29 11:31:07 +0100 F, [2015-07-29T11:31:07.206758 #25813] FATAL -- : ActionController::RoutingError (No route matches [GET] "/en/sign_in"): actionpack (4.2.3) lib/action_dispatch/middleware/debug_exceptions.rb:21:in call'
newrelic_rpm (3.12.1.298) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in
call' actionpack (4.2.3) lib/action_dispatch/middleware/show_exceptions.rb:30:in call'
newrelic_rpm (3.12.1.298) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in
call' railties (4.2.3) lib/rails/rack/logger.rb:38:in call_app' railties (4.2.3) lib/rails/rack/logger.rb:20:inblock in call'

换句话说,account.mydomain.com和api.mydomain.com仍然充当了我的主域名"mydomain.com"的角色(作为相同的域名)。

更新:

我在页面中添加了这段代码:

<%= request.domain.inspect %><br>
<%= request.subdomain.inspect %>

访问:http://api.mydomain.co.ao

作为域名:"co.ao"

作为子域名:"api.mydomain"

但是我这里的子域名只有:api

出了什么问题?


@PierangeloOrizio 感谢您的评论。我正在使用Rails 4.2.3,据我所见,relative_url_root已被弃用:此方法已被弃用或在最新稳定版本中移动。最后一个现有版本(v2.1.0)在此处显示。- http://apidock.com/rails/ActionController/AbstractRequest/relative_url_root - WeezHard
@PierangeloOrizio 我正在使用Nginx 1.8.0和Passenger 5.0.11。 - WeezHard
@PierangeloOrizio 请看我的更新。 - WeezHard
1
在production.rb中,将“config.action_dispatch.tld_length = 2”设置为默认值tld_length = 1。 - Pardeep Dhingra
太好了..@P.Santos..我将其添加为答案... - Pardeep Dhingra
显示剩余3条评论
1个回答

9

默认

tld_length = 1

您需要将tld_length更新为2,以适用于像co.in、co.au这样的域名。

尝试:

config.action_dispatch.tld_length = 2

在config/enviroments/production.rb文件中

参考文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接