htaccessを使用せずにRailsで「myapp.com」を「www.myapp.com」にリダイレクトしますか?

StackOverflow https://stackoverflow.com/questions/327122

質問

Morph LabsのAppspaceを使用してサイトを展開すると、「myapp.com」を「www.myapp.com」にリダイレクトする自動化された方法がなくなります(.htacessにアクセスできなくなります)。

これを行うためのレール内の方法はありますか? subdomain-fu のようなプラグインが必要ですか?

具体的には、次のようなことをしようとしています:

  • 'myapp.com' => 「www.myapp.com」
  • 'myapp.com/session/new' => 'www.myapp.com/session/new'

基本的に、リクエストごとに「www」サブドメインを常に追加する必要があります(SSL証明書の一般名は「www.myapp.com」であるため)。

役に立ちましたか?

解決

たぶん、このような何かがトリックを行うでしょう:

class ApplicationController < ActionController::Base
  before_filter :check_uri

  def check_uri
    redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host)
  end
end

他のヒント

カーソンの答えはすばらしい。

これは逆のコードです(www-&gt; no www)

before_filter :check_uri

def check_uri
  if /^www/.match(request.host)
    redirect_to request.protocol + request.host_with_port[4..-1] + request.request_uri 
  end
end

これをRails 3で動作させるには、Carsonの答えを変更する必要がありました。request.uriをrequest.fullpathに置き換えました。

class ApplicationController < ActionController::Base
  protect_from_forgery

  Rails.env.production? do
    before_filter :check_url
  end

  def check_url
    redirect_to request.protocol + "www." + request.host_with_port + request.fullpath if !/^www/.match(request.host)
  end
end

これは私にとってはうまくいきました。実稼働環境でのみこの動作が必要だったため、少し追加しました。

def check_uri
  redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host) if Rails.env == 'production'
end

これには答えがありますが、CodeRack:Canonical Hostソリューションについて他の誰もが知っておくべきだと思いました。これは、環境固有のリダイレクトを許可するため、非常に便利です。 http://coderack.org/users/tylerhunt/middlewares/6-canonical-ホスト

ここにいくつかの異なる方法があります:

 head :moved_permanently, :location => ‘http://www.newdomain.com’

別:

def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end 

herokuを使用してSSLを強制する場合、ルートドメインのHeroku SSL

DNS設定で、URL / Forward Record(DNS Simple)を設定しました

URL foo.com     3600        http://www.foo.com

CNAMEの設定は、WWW用に設定するだけで済みます

CNAME   www.foo.com 3600        providedssslendpoint.herokussl.com

ルートのエイリアスとエイリアスも設定する必要がありました

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

次に、 foo.com をenv変数 ENV ['SITE_HOST'] (SITE_HOSTはwww.foo.comまたはtest.fooに等しい場合があります)に置き換えることにしました.com)ので、herokuの設定を介して制御できます。そうすれば、さまざまな環境で何が起こるかを制御できます。 (ローカルでenv変数を設定するには、 https://github.com/bkeepers/dotenv をご覧ください)

たとえば、私のテストアプリは test.foo.com をURLとして使用し、独自のSSLエンドポイントも持っているため、私にとっては問題なく動作します。

  before_filter :check_domain

  def check_domain
    if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
      redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
    end
  end

これからは、エンドユーザーは常に強制SSLでwwwにアクセスします。古いリンクは少しハングアップしますが、目立ったものはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top