从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。
好吧,对于任何想做这样事情的人来说,我已经找到了一种方法来实现我想要的。这可能不是最好的方法,但它正在发挥作用。。。现在,当用户点击我的https网站中的链接并被转移到外部http网站时,他们会在他们的网络统计中看到来自我网站的访问者(除非他们禁用了javascript)。
-
首先,这可能不适用于你们中的任何人,但由于我的global.asax文件设置为将非https输入的url重定向到https,我不得不在全局代码中为特定文件夹破例,然后我在其中放了一个新的aspx页面作为我的通过页面。假设新文件夹的名称为"链接"。
-
然后,我将超链接设置为在单击时指向该页面,并为其分配一些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",所以它会弹出一个新窗口。否则,如果用户单击后退按钮,它会将他们返回到直通页面(而不是返回到他们单击链接的页面),这将再次将他们发送回链接,他们可能会感到沮丧。
-
然后,剩下的工作在我在"/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);
}
}
不管怎样,这就是我所做的让它工作。如果有人看到有什么大问题,请告诉我。否则,我希望有人会觉得它有帮助。