2010-03-31 3 views
0

L'application Mon Rails comporte des pages SSL et d'autres SSL-facultatives. Les pages facultatives utilisent certains éléments qui sont fournis hors site (images d'un fournisseur) et qui ont des URL http et https. J'ai besoin d'utiliser https lorsque la page est accessible via SSL pour éviter la redoutée "cette page contient à la fois des éléments sécurisés et non sécurisés".Comment puis-je modifier le code de vue Rails pour les visiteurs du site utilisant SSL?

J'ai écrit du code pour renvoyer les URL de l'image en tant que http par défaut et https si demandé. Mon problème maintenant est de déterminer dans la vue comment la demande est entrée. Request.ssl? ne fonctionne pas dans les vues.

J'ai essayé d'utiliser un before_filter qui définit quelque chose comme @ssl_request en utilisant request.ssl ​​?, mais qui renvoie aussi toujours false. Y a-t-il une manière plus élégante de faire ceci?

La pile du serveur est Nginx et Passenger. D'autres applications avec des piles Apache => Mongrel transmettent un en-tête X_FORWARDED_PROTO pour indiquer à Rails que SSL est ou n'est pas utilisé; Est-il possible que Nginx/Passenger ne le fasse pas?

+0

Vous pouvez intégrer 'https' servi des images dans une page' http', il n'y a pas besoin de créer une aide - à moins que vous ne preniez en charge les navigateurs qui ne peuvent pas utiliser https, dans lequel je viens de répondre à ma propre question. – amingilani

Répondre

1

Essayez un before_filter à application.rb:

before_filter { |c| UMNAuthFilter.filter(c) if c.request.ssl? } 

sous la direction d'ajouter :) exactitude

+0

Ce billet de blog ne dit rien sur la façon de dire si la requête était http ou https dans la vue; tout est sur la façon de contrôler si les liens dans l'application apparaissent comme http ou https. – pjmorse

+0

La version éditée semble prometteuse, mais request.ssl? retourne toujours faux dans tous les cas. Je soupçonne toujours qu'il y a une place dans la chaîne Nginx-> Passenger-> Rails où le mot que la demande est SSL est abandonné. – pjmorse

+0

Kicked le serveur quelques fois de plus et cela a fonctionné. – pjmorse

1
<img src="//cdn.example.com/images/99dbe20bc52e4caa.jpg"> 
+0

Intelligent, mais les domaines sont différents dans ce cas, par ex. cdn.example.com et cdn-secure.example.com. – pjmorse

+0

Ensuite, vous aurez peut-être besoin d'une logique côté serveur plus compliquée. Mais je suis juste curieux, pourquoi avez-vous deux domaines CDN séparés pour HTTP et HTTPS? – yfeldblum

+0

Ils ne sont pas à moi - ils sont Amazon. Les photos des produits sont disponibles sur http://ecx.images-amazon.com ou https://images-na.ssl-images-amazon.com. Je ne sais pas pourquoi ils l'ont fait de cette façon. – pjmorse