web-dev-qa-db-fra.com

Rails - Comment rediriger à partir de http://example.com à https://www.example.com.com

Je cherche à apprendre à nettoyer les URL de mes applications. Mon application est alimentée par Rails 3 sur Heroku.

L'URL souhaitée est https://www.example.comite.com

Je voudrais rediriger toutes les URL contrairement à ce qui précède sur cette URL. Est-ce un Rails chose ou DNS?

Mauvaises URL:

https://example.comite.com
http://www.example.comite.com
http://example.comite.com

Et si quelque chose est traînant, comme http://www.example.comite.com/photo/1 Pour que l'URL soit redirigée avec le chemin: https://www.example.comite.com/photo/1

35
AnApprentice

Les enregistrements DNS ne peuvent pas définir le protocole d'un domaine, vous ne pouvez donc pas rediriger http:// à https:// via DNS. Le faire à travers la configuration du serveur Web n'est pas portable, difficile à faire, d'erreur sujette et simplement obsolète. C'est un travail mieux géré par le Rails routeur.

# beginning of routes.rb 
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :protocol => "http://" }
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :subdomain => "" }
18
edgerunner

Comme une extension à Réponse d'User2100689 , IN Rails 3+ Vous pouvez utiliser config.force_ssl = true in config/environnements/production.rb

La ligne peut simplement être non motivée comme suit

# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true
51
Jon

Vous pouvez toujours jeter cela dans votre production.rb ... config.use_ssl = true

7
user2100689

Parce que c'est Heroku, vous ne pouvez pas utiliser Apache ou Nginx Configs. Ce que vous pouvez faire est de mettre un fichier avant_filter dans votre applicationController, en supposant que vous avez 3 contrôleurs ou plus comme ceux-ci ci-dessous, bien que bien sûr, ils seront dans des fichiers distincts

class ApplicationController < ActionController::Base
    def redirect_https        
        redirect_to :protocol => "https://" unless request.ssl?
        return true
    end
    before_filter :redirect_https
end
class TypicalController < ApplicationController
    def blah
    end
end
class HomePageController < ApplicationController
    skip_before_filter :redirect_https
end

Vous avez peut-être aussi besoin de violez un peu vos itinéraires lorsque vous utilisez Concevez, mais je soupçonne que c'était comme ça que nous l'avons fait, donc je ne vais pas entrer dans ces détails ici, et j'ai modifié le code ci-dessus pour éviter cette complication.

heureux piratage.

7
user693960

Rails 3.1.0 et supérieur a force_ssl, qui est une méthode de contrôleur qui redirigera vers HTTPS pour les environnements non de développement.

http://api.rubyonrails.org/classes/actioncontroller/forcessl/classmethods.html

Placez-le dans chaque contrôleur que vous souhaitez rediriger, ou mieux encore, placez-le dans votre applicationController:

app/Contrôleurs/Application.RB:

class ApplicationController < ActionController::Base
  # ...
  force_ssl
  # ...
end

C'est une bonne chose à inclure toujours dans vos applications (et bien sûr, vous devrez obtenir un certificat). Https partout!

7
Robin Daugherty