2012-04-03 1 views
1

Il fut un temps qu'une ligne comme celui-ci dans le contrôleur d'application désactiverait sessions entièrement pour une requête:Comment désactiver les sessions Rails pour les robots d'indexation?

session :off, :if => Proc.new {|req| req.user_agent =~ BOT_REGEX} 

Avec 3.x Rails, cela est soit obsolète ou ne fonctionne plus. Je me rends compte que le nouveau concept est que les sessions sont chargées paresseusement, mais le flux d'exécution à travers l'application utilise/vérifie les sessions même si c'est un robot Web.

Y a-t-il un nouveau mécanisme qui pourrait être utilisé pour désactiver les sessions à la demande?

Répondre

1

Il ne semble pas être un moyen intégré pour le faire dans Rails 3, mais vous pouvez patch singe SessionHash pour obtenir un résultat similaire:

class ActionDispatch::Session::AbstractStore::SessionHash 
    private 
    def load_for_write! 
     load! unless loaded? || (@env['HTTP_USER_AGENT'] =~ BOT_REGEX) 
    end 
end 

Cela permettra d'éviter l'objet de restauration de session de Étant créé. Vous serez toujours en mesure d'assigner dans le hachage session, et même accéder aux mêmes données de session plus tard dans la même demande.

+0

Huh - c'est vraiment intéressant. Comment sais-tu cela? C'est-à-dire, comment pourrais-je vérifier cela pour moi-même? Je suppose que le code source pour le SessionHash.load_for_write! méthode? – Dogweather

+1

Vous pouvez tester manuellement en configurant votre agent utilisateur sur un élément qui sera détecté en tant que robot (par exemple [en chrome] (http://browserfame.com/314/change-user-agent-chrome-browser)), en supprimant les cookies de session existants que vous pouvez avoir, et la navigation sur votre site. Chaque journal Rails d'action doit avoir la ligne "No session found" - ou vous pouvez regarder la table de vos sessions si vous utilisez ActiveStore SessionStore et vérifier qu'aucun nouvel enregistrement de session n'est ajouté à la base de données. – jordoh

+1

Merci, mais ce que je me demande, c'est comment avez-vous trouvé cette solution? Comment savez-vous que vous pouvez faire ce genre de remplacement de code? Et enfin, où est le meilleur endroit pour placer ce code, pour travailler dans la séquence de démarrage de Rails? – Dogweather

1

Je suppose que la réponse de @ jordoh fonctionne pour les rails par défaut cookie_store, mais n'a pas fonctionné pour moi en utilisant active_record_store pour stocker mes sessions dans la base de données.

Si vous utilisez le active_record_store et que vous voulez arrêter les sessions créées pour les bots cela fonctionne:

# Save this file as config/initializers/session_store_ext.rb 
# and don't forget to define BOT_REGEX 

class ActiveRecord::SessionStore 
    _set_session = instance_method :set_session 

    define_method :set_session do | env, sid, session_data, options | 
    unless env['HTTP_USER_AGENT'] =~ BOT_REGEX 
     _set_session.bind(self).call env, sid, session_data, options 
    end 

    sid 
    end 

    private :set_session 
end 

J'ai écrit un billet de blog détaillant ce - Conditionally Disabling Database Sessions in Ruby on Rails 3

Questions connexes