【问题标题】:Send http_referer from response.redirect page to external website将 http_referer 从 response.redirect 页面发送到外部网站
【发布时间】:2014-10-24 21:50:32
【问题描述】:

我在我的 asp.net https 网站上有链接,并希望引荐来源网址显示在我将访问者发送到的网站的网络统计信息中。由于我无法将 http_referer 信息从我的 https 发送到外部 http 站点,因此我尝试在我的站点上设置一个不安全的传递页面,然后从那里 response.redirect 到链接目标。

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

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

是否有可能以某种方式完成此任务?似乎必须如此,因为当我单击 facebook (https) 中的链接时,它首先会重定向到不同的页面,然后我的分析将 facebook 显示为引荐来源(即使在 Firefox 中)。

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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

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

      1234563 ,然后我在其中放置了一个新的 aspx 页面作为我的传递页面。假设新文件夹的名称是“Link”。
    1. 然后我将我的超链接设置为在单击时指向该页面并为其分配一些查询字符串参数,以便我可以在非安全传递页面中提取必要的信息。在后面的代码中,我将它应用于 ID 为“link”的 HyperLink 的 Page_Load 中,例如:link.NavigateUrl = ResolveUrl("http://www.mywebsitehere.com/Link/l.aspx?id=" + lnkid.Text); 我的链接填充在datalist,所以我在 datalist ItemTemplate ' Visible="false" /> 中添加了一个标签,以获取该链接的 id 并通过前面以粗体文本提到的代码隐藏将其应用于超链接。这样我就可以从传递页面上的数据库中提取我的 URL 信息。请务必将链接目标设置为“_blank”,以便在新窗口中弹出。否则,如果用户单击后退按钮,它会将他们返回到传递页面(而不是返回到他们单击链接的页面),这将使他们再次返回链接,他们可能会感到沮丧.

    2. 然后其余部分在我设置在“/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 代码隐藏

    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);
    
    }
    }
    

    无论如何,这就是我为使其正常工作所做的。如果有人看到任何大问题,请告诉我。否则,我希望有人会觉得它有帮助。

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多