将response.redirect页面中的http_referer发送到外部网站

时间:2014-10-24 21:50:32

标签: c# asp.net

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

  

mysite(https)>另一页(http)response.redirect> externalsite(HTTP)

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

有可能以某种方式实现这一目标吗?它似乎一定是,因为当我点击Facebook(https)中的链接时,它首先重定向到另一个页面,然后我的分析显示Facebook作为引用者(即使在Firefox中)。

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

1 个答案:

答案 0 :(得分:0)

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

  1. 首先,这可能不适用于任何人,但由于我将global.asax文件设置为将非https输入的网址重定向到https,因此我不得不对该全局代码中的特定文件夹设置例外,然后我在那里放了一个新的aspx页面作为我的传递页面。假设新文件夹的名称是“链接”。

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

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

  4. .aspx page

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

    无论如何,这是我为了让它发挥作用所做的。如果有人发现任何重大问题,请告诉我。否则,我希望有人会觉得它有用。