Redirect forzato in SSL

Ho un’applicazione Rails ospitata nella intranet aziendale, accessibile
in una directory ‘rails_app_dir’ (uno ‘scope’ dal punto di vista delle
regole di Routing):

https://intranet.azienda/ ← la home della intranet
https://intranet.azienda/rails_app_dir ← la mia applicazione Rails

Il livello SSL viene gestito a livello aziendale da un reverse proxy,
qundi le richieste che arrivano sia al web server (Nginx) che alla mia
app Rails sono già in http.

Il problema è che tutte le redirect_to (es. redirect_to book) vengono
passate (costruite) in http, generando un errore.

Forzando mediante:
config.force_ssl = true

non risolve il problema perché comunque a Rails, anche dopo un
redirezionamento la richiesta arriva ancora in http, e questo genera un
loop di redirezionamenti…

Qualche idea?

Grazie mille,
Vi auguro una magnifica giornata,

iwan

Il giorno 15/nov/2012, alle ore 14:00, Iwan B. [email protected] ha
scritto:

Forzando mediante:
config.force_ssl = true

non risolve il problema perch comunque a Rails, anche dopo un
redirezionamento la richiesta arriva ancora in http, e questo genera un
loop di redirezionamenti…

Qualche idea?

la prima che mi viene in mente di non usare i path helpers tipo
users_path, bens users_url. in questo modo le url generate dovrebbero
contenere il prefisso https :slight_smile:

ciao,
A.


http://andreapavoni.com

Quindi devi generare le URL in modo che usino HTTPS in uscita, ma devi
accettare HTTP in entrata. Ho capito bene?

Forse un problema che risolvi facendoti un middleware ad-hoc. E’ anche
facile da fare secondo me.
Tieni config.force_ssl = false e quando la URL esce gli cambi lo
scheme ad https://

-f

On 15/nov/2012, at 14:35, Fabrizio R. wrote:

Quindi devi generare le URL in modo che usino HTTPS in uscita, ma devi accettare
HTTP in entrata. Ho capito bene?

Esatto

Forse un problema che risolvi facendoti un middleware ad-hoc. E’ anche facile
da fare secondo me.
Tieni config.force_ssl = false e quando la URL esce gli cambi lo scheme ad
https://

Mmmmh… e come?

Effettivamente non proprio banale, neanche trascendentale.
Il tuo problema sono URL dei redirect, visto che i path helpers stampano
un path quindi lo schema da usare in quel caso viene interpretato dal
browser.

Per i redirect, visto che si tratta di un header, puoi usare una cosa
del genere:

con @app.call(env) passi la chiamata in basso nello stack, ispezioni gli
header e se si tratta di un redirect cambi lo schema.

-f

E’ solo un esempio, te ne devi fare uno da te che fa quello che ti
serve.

per il redirect_to basta:

:protocol => ‘https’

magari ti fai un helper method tipo:

redirect_to_ssl

ed usi solamente quello, oppure puoi fare l’overriding di redirect_to.
Non credo che ci sia bisogno di

config.force_ssl = false

Riprendendo quanto dicono i ragazzi credo che la soluzione possa essere
suddivisa in due parti.

Primo. Utilizza gli _url helpers invece di _path helpers

resource_path(resource) # wrong
resource_url(resource) # correct

Secondo. Setta https come protocollo predefinito nella generazione degli
url.

def default_url_options(options={})
{ :secure => true }
end

Facci sapere.

On Thu, Nov 15, 2012 at 4:01 PM, Riccardo T.
[email protected]wrote:

config.force_ssl = false


Posted via http://www.ruby-forum.com/.


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Andrea R.
Lelylan | reThink your house
http://lelylan.com

Giusto, soluzione migliore. Dovrebbe funzionare.
Il giorno 15/nov/2012 18:06, “Andrea R.”
[email protected]
ha scritto:

Dimenticavo, default_url_options pu stare dentro la classe
ApplicationController.

2012/11/15 Andrea R. [email protected]


Andrea R.
Lelylan | reThink your house
http://lelylan.com


Andrea R.
Lelylan | reThink your house
http://lelylan.com

Uso frequentemente utilizzare rails dietro ad un proxy https non mi
ricordo di aver avuto molti problemi… Come reverse proxy uso
lighttpd ma non penso sia differente.

Per i link utilizzo _path in maniera che l’indirizzo sia riferito
all’url a cui e` connesso l’utente (indipendentemente che sia http o
https)

nel caso mi sia indispensabile utilizzare un url aggiungo :protocol =>
‘https’ al link

A parte questo non mi ricordo altre difficolta.

Andrea

Ho risolto mettendo:

def default_url_options(options={})
{ :protocol => (Rails.env==“production” ? “https://” : “http://”) }
end

in application_controller.rb

Direttiva che purtroppo viene ignorata dalla gemma cancan…
Il tutto risolto aggiungendo, nel medesimo file, la seguente:

rescue_from CanCan::AccessDenied do |exception|
redirect_to access_denied_path(:protocol => (Rails.env==“production”
? “https://” : “http://”))
end

Grazie mille per l’aiuto.
Buone feste!

iwan