Domanda

L'uso dello spazio app di Morph Labs per distribuire un sito non significa alcun modo automatizzato per reindirizzare "myapp.com" a "www.myapp.com" (e nessun accesso a .htacess).

Esiste un modo in-rails per farlo? Avrei bisogno di un plug-in come subdomain-fu ?

Più specificamente, sto cercando di fare qualcosa del tipo:

  • 'myapp.com' = > 'Www.myapp.com'
  • 'myapp.com/session/new' = > 'Www.myapp.com/session/new'

Fondamentalmente, voglio sempre che il sottodominio "www" sia anteposto ad ogni richiesta (perché il certificato SSL ha specificamente un nome comune di "www.myapp.com").

È stato utile?

Soluzione

Forse qualcosa del genere farebbe il trucco:

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

Altri suggerimenti

La risposta di Carson funziona alla grande.

Ecco il codice per andare dall'altra parte (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

Ho dovuto cambiare la risposta di Carson per farlo funzionare su Rails 3. Ho sostituito request.uri con 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

Questo ha funzionato alla grande per me. Ho fatto una piccola aggiunta perché volevo solo questo comportamento nel mio ambiente di produzione:

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

So che questa è una risposta, ma ho pensato che tutti gli altri dovrebbero sapere della soluzione CodeRack: Canonical Host. Questo è davvero bello in quanto consente reindirizzamenti specifici per l'ambiente. http://coderack.org/users/tylerhunt/middlewares/6-canonical- ospiterà

Ecco un paio di modi diversi:

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

un altro:

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

Per quelli di voi che stanno cercando di forzare anche SSL usando heroku, questo ha funzionato bene per me, basato su Heroku SSL sul dominio principale

Nelle mie impostazioni DNS ho impostato un record URL / Forward (DNS semplice)

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

L'impostazione CNAME deve essere configurata solo per il WWW

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

Ho anche dovuto installare e Alias ??per il mio root

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

Quindi ho deciso di sostituire semplicemente foo.com con una variabile env ENV ['SITE_HOST'] (dove SITE_HOST potrebbe equivalere a www.foo.com o test.foo .com) così posso avere il controllo tramite la mia configurazione heroku. In questo modo, posso controllare cosa succede in diversi ambienti. (per l'impostazione delle variabili env in locale, vedere https://github.com/bkeepers/dotenv )

Ad esempio, la mia app di test utilizza test.foo.com come url ha anche un proprio endpoint SSL in modo che funzioni bene per me.

  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

D'ora in poi, gli utenti finali accederanno sempre a www con SSL forzato. I vecchi collegamenti subiranno un piccolo blocco ma nulla di evidente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top