web-dev-qa-db-fra.com

Comment puis-je transmettre l'en-tête de référent de mon domaine https aux domaines http?

Mon site web est 100% https. J'ai des liens vers d'autres domaines http. L'en-tête du référent n'est pas défini lors de la liaison d'une page https vers une page http. De http://en.wikipedia.org/wiki/HTTP_referrer

Si vous accédez à un site Web à partir d'une connexion HTTP sécurisée (HTTPS) et qu'un lien pointe vers un emplacement quelconque, à l'exception d'un autre emplacement sécurisé, le champ référant n'est pas envoyé.

Je préférerais que d'autres domaines puissent voir le référent afin qu'ils sachent que le trafic provient de mon domaine. Existe-t-il un moyen de forcer cet en-tête ou existe-t-il une autre solution?

Mettre à jour

J'ai fait quelques tests de base en utilisant une redirection:

http page  -- link to http  --> 301 redirect --> http page = referrer intact
https page -- link to https --> 301 redirect --> http page = referrer blank
https page -- link to http  --> 301 redirect --> http page = referrer blank
https page -- link to http  --> 302 redirect --> http page = referrer blank

Le référent est perdu lors de la liaison d'une page https vers une page de redirection http sur mon propre domaine. Donc, il n'y a pas de référent sur la redirection.

11
nutcracker

J'ai pu configurer un lien d'une page HTTPS vers une page HTTP d'un autre domaine et toujours transmettre l'URL de la première page en tant que référent en utilisant la technique suivante.

Définitions

Page d'origine : page HTTPS contenant le lien vers la page de destination hébergée HTTP. Dans cet exemple: https://example1.com/Origin.html

Page de destination : page HTTP ayant accès au référent de la page d'origine. Dans cet exemple: http://example2.com/destination.html

Plan de base

Cela a pour effet que la redirection provient de la version HTTP de la page Origin:

  1. Lien sur la page d'origine HTTPS renvoie à la page en cours mais ajoute un paramètre de requête pour la page de destination [1]. par exemple: https://example1.com/Origin.html?goto=http://example2.com/destination.html

  2. Lorsque le lien est cliqué, le serveur exemple1.com interrompt la demande standard lorsque le paramètre de requête 'goto' est présent. Alors:

    • Stocke le paramètre 'goto' dans un cookie 'goto'.
    • Supprime le paramètre 'goto' et la valeur de l'URL de la demande en cours
    • 302 redirige vers cette nouvelle URL nettoyée sur la version HTTP du domaine d'origine c'est-à-dire. http://example1.com/Origin.html
  3. Le serveur vérifie chaque demande de cookie 'goto' et, le cas échéant, effacera le cookie, puis affichera une page de redirection très simple. Cette page contient [2]:

    • Un script Javascript window.location.replace () qui redirige vers l'URL du cookie.
    • Une balise Meta Refresh avec la valeur de l'URL de goto cookie et un délai de quelques secondes.
    • Un lien vers l'URL du cookie.

Remarques

[1] Cette solution de base est un open redirector et il convient de prendre en compte la protection contre les pirates utilisant le paramètre de requête goto pour rediriger les agents utilisateurs lors d'attaques par phishing.

[2] Tous les navigateurs n'enverront pas le référent lors d'une redirection via une balise de redirection JS ou une balise META refresh. Dans mes tests, IE8 et les versions antérieures ne passent pas le renvoi.

Je ne sais pas si cette technique permettra aux robots des moteurs de recherche de suivre les liens. Ce n'est pas important pour mes besoins.

Si les cookies sont désactivés dans l'agent utilisateur, la redirection vers la page d'origine est à nouveau effectuée.

Autoriser les connexions HTTP uniquement pour les redirections

Sur mon serveur, j'ai une règle Apache pour appliquer HTTPS indépendamment de la demande:

<VirtualHost *:80>
    ServerName example1.com

    # if not on port 443 then 301 redirect to https while keeping any query string
    RewriteEngine              On
    RewriteCond %{HTTP_Host}  ^example1\.com$ [NC]
    RewriteCond     %{SERVER_PORT} !443
    RewriteRule     ^(.*)$     https://%{HTTP_Host}$1 [L,QSA,R=301]

Pour que la technique de redirection ci-dessus fonctionne, j'ai besoin d'un moyen d'autoriser conditionnellement les connexions HTTP. Il y a plusieurs façons de le faire. J'ai décidé qu'un cookie fonctionnerait.

<VirtualHost *:80>
    ServerName example1.com

    # if not on port 443 then 301 redirect to https while keeping any query string
    RewriteEngine              On
    RewriteCond %{HTTP_Host}  ^example1\.com$ [NC]
    RewriteCond     %{SERVER_PORT} !443
    RewriteCond %{HTTP_COOKIE}  !disable_ssl [NC]
    RewriteRule     ^(.*)$     https://%{HTTP_Host}$1 [L,QSA,R=301]

Le cookie disable_ssl serait défini à l’étape 2 puis supprimé à l’étape 3.

5
nutcracker

Comme mentionné est cette réponse il existe une nouvelle méthode pour ce faire: Politique de référent/balise méta.

Voir spec et exemple dans ce rapport .

9
Abbafei

J'ai aussi eu le même problème. Je résous en ajoutant une balise méta comme ci-dessous et il ne fonctionnera que dans Chrome et Safari.

<meta name="Referrer" content="Origin">
8
Mahendran Sakkarai

Malheureusement, vous ne pouvez pas référencer HTTPS vers des sites utilisant HTTP. Vous pouvez toutefois utiliser HTTPS à HTTPS ou HTTP à HTTPS.

SOURCE

Les clients NE DEVRAIENT PAS inclure de champ d’en-tête de référent dans une requête HTTP (non sécurisée) si la page de renvoi a été transférée avec un protocole sécurisé.

Une solution consiste à utiliser un script de redirection interne qui plutôt que de diriger la liaison vers le visiteur sur le protocole HTTPS que vous redirigez vers HTTP, puis redirige vers l'extérieur.

Par exemple:

<a href="http://www.yours.com/out.php?www.other.com">www.outboundsite.com</a> mais cela n'utiliserait pas le référent d'origine.

Une autre possibilité consiste à utiliser rétroliens plutôt que des référants et, autant que je sache, cela fonctionne en HTTPS.

6
Simon Hayter

selon le protocole HTTP 1.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.

Les clients NE DEVRAIENT PAS inclure de champ d’en-tête de référant dans une requête HTTP (non sécurisée) si la page de renvoi a été transférée avec une connexion sécurisée.

2
tony

On dirait que ce que vous voulez n'est pas possible, donc une solution de contournement possible; Si le site cible utilise Google Analytics (ou un programme compatible, je pense que Piwik utilise une syntaxe similaire, et que d'autres logiciels de statistiques seraient daft pour l'ignorer), vous pouvez envoyer les paramètres de suivi, par exemple dans votre lien vers example.com.

http://www.example.com/?utm_campaign=spring&utm_medium=referral&utm_source=exampleblog

cela apparaîtra dans leur GA avec les détails, assurez-vous de choisir des valeurs qu'il est peu probable que quelqu'un d'autre utilise pour ne pas les forcer à entrer dans des conflits/ou ne cachez pas votre trafic derrière quelqu'un d'autre

Google fait ici un constructeur d'URL pratique http://support.google.com/analytics/answer/1033867?hl=fr

Mise à jour - Objet: Etiquette

Sans en savoir plus sur la nature du trafic, je ne peux parler que de manière générale/personnelle ...

L'étiquette sera toujours dans l'œil du spectateur. Sans cela, je pense que dans GA au moins, cela apparaîtrait comme direct, ou peut-être (aucun ensemble) qui fausserait leurs chiffres pour donner l'impression que leur marque était plus grande qu'elle ne l'est réellement. Personnellement, je préférerais une campagne soigneusement choisie pour que je sache d'où vient le trafic.

Vous pouvez aussi regarder comme si, si vous leur envoyez à peine du trafic, ils ne le remarqueront probablement pas, si vous leur en envoyez beaucoup, ils ne se plaindront probablement pas! S'ils le font, vous pouvez généralement trouver quelqu'un d'autre à qui donner du trafic gratuit!

et si vous êtes très précis, cela ne devrait pas causer de problèmes; campagne comme nom de votre site et source comme section de votre site peut-être?

http://www.example.com/?utm_campaign=mygreatsite.com&utm_medium=referral&utm_source=specialoffers
0
CodeMonkey