htaccessを使用せずにRailsで「myapp.com」を「www.myapp.com」にリダイレクトしますか?
-
11-07-2019 - |
質問
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にアクセスします。古いリンクは少しハングアップしますが、目立ったものはありません。