Utilisation d'URL sécurisées en fonction du contexte

9

Je connais l'utilisation de différentes méthodes pour générer une URL sécurisée en fonction du contexte, c'est-à-dire:

$this->getUrl('my-page', array('_forced_secure' => $this->getRequest()->isSecure()));

Cela fonctionne très bien pour créer des liens qui mèneront à une page sécurisée lorsque vous êtes en mode sécurisé (ou lieront simplement à la page non sécurisée si vous n'utilisez pas le mode sécurisé).

Le problème que je regarde est que Magento ne traite que quelques pages spéciales comme devant être sécurisées (compte client, paiement, etc.). Ce que je préférerais, c'est que Magento utilise toujours un lien sécurisé si l'utilisateur est actuellement en mode sécurisé , ou utilise le lien non sécurisé si l'utilisateur est en mode non sécurisé.

D'après ce que je peux dire, mes seules vraies options sont:

  1. Modifiez chaque instance de $this->getUrl()pour qu'elle soit similaire à l'extrait ci-dessus.
  2. Définissez non sécurisé base_urlpour utiliser HTTPS, forçant toutes les pages à sécuriser.

Existe-t-il une meilleure méthode qui n'implique pas de devoir changer chaque appel $this->getUrl()ou forcer toutes les pages en HTTPS quel que soit le contexte de l'utilisateur?

-- Éditer --

Je suis conscient que je peux modifier la /app/code/core/Mage/Core/Model/Url.php->setRouteParams()méthode, mais j'espère qu'il existe une méthode plus propre.

pspahn
la source

Réponses:

5

Le fait que Magento corresponde toujours au protocole sur lequel l'utilisateur se trouve actuellement entraînerait des problèmes, comme le fait de ne pas envoyer d'URL sécurisées à la page de connexion du client lorsqu'il se trouve sur une URL non sécurisée comme la page d'accueil du site.

Ce que je suggérerais, c'est d'ajouter du XML de configuration au fichier de configuration d'un module personnalisé pour déclarer les routes supplémentaires dont vous avez besoin pour être sécurisées. Vous faites cela en ayant ceci dans votre fichier config.xml (en le remplaçant module_or_route_idpar quelque chose d'unique:

<config>
    <frontend>
        <secure_url>
            <module_or_route_id>/route/</module_or_route_id>
        </secure_url>
    </frontend>
</config>

Si vous jetez un œil au fichier config.xml pour le module Mage_Customer, vous verrez un exemple de cela où le chemin "/ client /" a été défini comme sécurisé.

Remarque: si la module_or_route_idpartie de l'exemple ci-dessus n'est pas unique, une seule définition sera utilisée, ce qui signifie que quelque chose n'est pas correctement sécurisé. Assurez-vous que le nom du nœud est unique. :)

Parce que c'est basé sur un chemin, je ne sais pas comment cela s'appliquerait directement aux URL des pages de contenu CMS individuelles, par exemple, car elles partageront toujours un itinéraire / chemin car c'est une réécriture qui les envoie toutes au même CMS manette.

Si vous avez vraiment besoin de l'ensemble du site pour exécuter HTTPS, vous devrez utiliser https: // URL pour les paramètres d'URL de base sécurisés et non sécurisés.

davidalger
la source
Je préférerais simplement modifier le modèle d'URL principal plutôt que d'inclure des routes sécurisées supplémentaires pour chaque route frontale possible (en particulier les routes «non visibles» telles que catalogsearch / ajax / suggest, etc.). Oui, c'est un changement fondamental, mais il s'agit de trois lignes de code supplémentaires par rapport au nombre nécessaire pour couvrir toutes les routes frontales. Dans une situation où ce ne sont que quelques itinéraires que vous souhaitez modifier, votre suggestion a beaucoup plus de sens.
pspahn
Dans le passé, nous avons modifié Mage_Core_Model_Store::getBaseUrlpour rendre notre boutique toujours sécurisée lorsqu'elle est intégrée dans un onglet Facebook. Il y a d'autres choses à considérer cependant, comme le cache de bloc stockant le premier hit (vous devrez ajouter quelque chose à la clé de cache). Vous aurez également, comme le dit David, des liens non sécurisés pour vous connecter / passer à la caisse, ou finalement chaque client de votre site finira bien en mode sécurisé s'il se connecte ou frappe la caisse.
Peter O'Callaghan
1
@pspahn Avez-vous considéré que la définition d'un /catalogsearch/chemin d'accès sécurisé devrait inclure tout ce qui correspond /catalogsearch/*/*/? C'est-à-dire qu'il ne faudrait qu'une seule règle pour que tout catalogsearchsoit sécurisé.
davidalger
@Cags a souligné quelque chose que j'ai manqué, y compris dans ma réponse, et c'est la note sur les clés de cache ... si les URL ne sont pas cohérentes l'une ou l'autre, vous aurez des blocs mis en cache qui gâchent les liens résultants.
davidalger
C'est un bon point sur les clés de cache. Il semble que la meilleure façon de procéder serait de simplement exécuter tout HTTPS.
pspahn
2

Définissez les éléments suivants dans votre app/etc/config.xmlfichier:

<?xml version="1.0"?>
<config>
  <frontend>
    <secure_url>
      <all>/</all>
    </secure_url>
  </frontend>
</config>

Cela fonctionne dans Magento 1.9.1

Si l'utilisateur utilise https, cela devrait forcer toutes les URL à réécrire en https.

Artistan
la source
Encore mieux: n'utilisez pas config.xml mais local.xml
Michael
1

Il existe une option discrète mais importante dans System | Configuration | Web ~ où vous devez dire "utiliser une URL sécurisée en frontend" - si vous définissez cette option sur oui, une page chargée par https utilisera des liens https,

pas besoin d'écrire du code ou de fournir une configuration supplémentaire dans la plupart des cas

danser
la source