27

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」という共通名があるため)。

4

7 に答える 7

30

たぶん、次のようなことがうまくいくでしょう:

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
于 2008-11-29T04:14:05.720 に答える
8

カーソンの答えはうまくいきます。

これが逆のコードです (www -> 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
于 2009-11-13T14:55:44.970 に答える
5

これをRails3で機能させるには、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
于 2012-03-01T19:04:18.890 に答える
2

これは私にとってうまくいきました。実稼働環境でのみこの動作が必要だったので、1 つ小さな追加を行いました。

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
于 2010-06-28T00:16:31.123 に答える
1

これが回答されていることは知っていますが、他のすべての人が CodeRack: Canonical Host ソリューションについて知っておくべきだと思いました。env 固有のリダイレクトが可能になるため、これは非常に便利です。http://coderack.org/users/tylerhunt/middlewares/6-canonical-host

于 2010-07-25T20:18:06.810 に答える
0

Heroku を使用して SSL を強制することも検討している場合、ルート ドメインの Heroku SSL に基づいて、これはうまくいきました。

DNS 設定で、URL / 転送レコードを設定しました (DNS シンプル)

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 構成を介して制御できるようにすることにしました。そうすれば、さまざまな環境で何が起こるかを制御できます。(環境変数をローカルで設定するには、https://github.com/bkeepers/dotenvを参照してください)

たとえば、私のテスト アプリはURL としてtest.foo.comを使用し、独自の 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 にアクセスします。古いリンクは少しハングしますが、目立ったものはありません。

于 2013-10-16T05:37:55.673 に答える
0

いくつかの異なる方法を次に示します。

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

別:

def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end 
于 2008-11-29T03:45:44.530 に答える