从response.redirect页面向外部网站发送http_referer

本文关键字:http referer 网站 外部 redirect response | 更新日期: 2023-09-27 18:27:49

我在我的asp.nethttps网站上有链接,并希望引用人显示在我将访问者发送到的网站的网络统计数据中。由于我无法将http_referer信息从我的https发送到外部http网站,我尝试在我的网站上设置一个不安全的传递页面,然后从那里重定向到链接目的地。

mysite(https)>anotherpage(http)response.redirect>externalsite(http)

但它不会从response.redirect页面发送推荐人信息。它只是不断尝试使用点击链接的原始页面作为http_referer,由于https,该页面为null。

有可能以某种方式做到这一点吗?这似乎是必须的,因为当我点击脸书(https)中的链接时,它会先重定向到另一个页面,然后我的分析显示脸书是推荐人(即使在Firefox中也是如此)。

此外,我还实现了元标记选项<meta name="referrer" content="origin">,它适用于一些浏览器,但不适用于Firefox和IE。

从response.redirect页面向外部网站发送http_referer

好吧,对于任何想做这样事情的人来说,我已经找到了一种方法来实现我想要的。这可能不是最好的方法,但它正在发挥作用。。。现在,当用户点击我的https网站中的链接并被转移到外部http网站时,他们会在他们的网络统计中看到来自我网站的访问者(除非他们禁用了javascript)。

  1. 首先,这可能不适用于你们中的任何人,但由于我的global.asax文件设置为将非https输入的url重定向到https,我不得不在全局代码中为特定文件夹破例,然后我在其中放了一个新的aspx页面作为我的通过页面。假设新文件夹的名称为"链接"。

  2. 然后,我将超链接设置为在单击时指向该页面,并为其分配一些querystring参数,以便在非安全传递页面中提取必要的信息。在后面的代码中,我将其应用于ID为"link"的HyperLink的Page_Load中,如:link.NavigateUrl=ResolveUrl("http://www.mywebsitehere.com/Link/l.aspx?id="+lnkid.Text);我的链接填充在数据列表中,因此我在数据列表ItemTemplate‘Visible="false"/>中添加了一个标签,以获取该链接的id,并通过前面用粗体文本提到的代码索引将其应用于超链接。这样,我就可以从直通页上的数据库中提取URL信息。请确保将链接目标设置为"_blank",所以它会弹出一个新窗口。否则,如果用户单击后退按钮,它会将他们返回到直通页面(而不是返回到他们单击链接的页面),这将再次将他们发送回链接,他们可能会感到沮丧。

  3. 然后,剩下的工作在我在"/Link"文件夹中设置的非安全"直通"页面中完成。这里的大问题只是使用response.redirect没有附加任何引用人信息,因为它只是从最初点击链接的https页面中提取信息。我读到设置http_referer需要点击事件。我使用的技巧是在这个直通页面"l.aspx"中添加一个按钮,并在代码绑定中为其分配适当的链接,以便使用javascript自动单击它。然后在用户被转移到链接的目的地之前添加引用者信息。然而,如果浏览器中禁用了javascript,它只使用response.redirect,因此在这种情况下不会添加http_referer,但这仍然会处理大部分流量。

.aspx页面

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="l.aspx.cs" Inherits="Link_l" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Literal ID="nsliteral" runat="server" />
        <!--set borderwidth to zero and backcolor to white to hide the button. Otherwise it shows for a brief moment during the transfer.-->
        <asp:Button ID="testbtn" runat="server" OnClick="Btn_Click" Visible="true" BorderWidth="0" BackColor="White" />
    </div>
    </form>
</body>
</html>

.aspx.cs codebehind

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Configuration;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
public partial class Link_l : System.Web.UI.Page
{
string weburl;
protected void Page_Load(object sender, EventArgs e)
{
    AddMetaContentType();
    //add noscript to literal for users to have javascript disabled.
    nsliteral.Text = "<noscript><meta http-equiv=REFRESH content=0;URL=" + Request.Url + "&js=0></noscript>";

        //read querystring and pull link info from database, then redirect to link destination
        //redirect user to proper destination link that was clicked on in https page
        //created to get around https (secure) site preventing referrer url showing in stats when linking out to http sites for browsers that won't recognize the "content-type" meta tag.
        if (Request.QueryString["id"].ToString() != null)
        {
            SqlDataSource ds = new SqlDataSource();
            ds.ID = "LinkDataSource";
            Page.Controls.Add(ds);
            ds.ConnectionString = WebConfigurationManager.ConnectionStrings["yourConnectionStringNameHere"].ConnectionString;
            ds.SelectCommand = "SELECT ID, LinkURL FROM your_DatabaseTable WHERE ID = @ID";
            if (!IsPostBack)
            {
                ds.SelectParameters.Add("ID", DbType.Int32, Request.QueryString["ID"].ToString());
            }
            DataView dv;
            dv = (DataView)ds.Select(DataSourceSelectArguments.Empty);
            if (dv.Table.Rows.Count > 0)
            {
                DataRowView dr = dv[0];
                weburl = (string)dr["LinkURL"].ToString();
                if (Request.QueryString["js"] != null)
                {
                    //JavaScript is not detected to be enabled
                    Response.Redirect("http://" + weburl, false);
                }
                else
                {
                    //JavaScript is detected okay. Add javascript to click button with id "testbtn"
                    Page.ClientScript.RegisterStartupScript(this.GetType(), "ClickScript", "<script language='javascript'>document.getElementById('" + testbtn.ClientID + "').click();</script>");
                }
            }
        }
        else
        {
             //this page was visited with no id value in querystring
        }
}
protected void Btn_Click(object sender, EventArgs e)
{
    Response.Redirect("http://" + weburl, false);
}
private void AddMetaContentType()
{
    //went ahead and added meta tag that will help define referring domain in some browsers
    HtmlMeta meta = new HtmlMeta();
    meta.HttpEquiv = "content-type";
    meta.Content = Response.ContentType + "; charset=" + Response.ContentEncoding.HeaderName;
    Page.Header.Controls.Add(meta);
}
}

不管怎样,这就是我所做的让它工作。如果有人看到有什么大问题,请告诉我。否则,我希望有人会觉得它有帮助。