在传入网址的基础上调用网址

时间:2012-03-28 09:43:22

标签: c# asp.net .net

我正在尝试检测asp.net页面中的传入URL并在该URL的基础上做出一些决定但我面临的一些问题是我的c#代码检测网址和条件

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
       if (!IsPostBack)
       {
        String url = Request.ServerVariables["HTTP_REFERER"];
        if (url != "http://172.17.0.221:84/CP.aspx")
        {
            Response.Redirect("http://a.sml.com.pk");
        }
        else
        {
            Response.Redirect("http://172.17.0.221:85/MilkSale.aspx");
        }

       }        
    }    

</script>

但是当我从http://172.17.0.221:84/CP.aspx调用该页面时,它会出现此错误:

  

此网页有一个重定向循环。

     

http://172.17.0.221:85/MilkSale.aspx的网页导致重定向过多。清除此站点的cookie或允许第三方cookie可以解决问题。如果没有,则可能是服务器配置问题,而不是计算机问题。

任何人都可以告诉我这段代码中的错误是什么吗?

1 个答案:

答案 0 :(得分:2)

如果您的脚本语句也在MilkSale.aspx页面上,那么每次页面被点击时它都会触发;实际上,它将永远重定向到自己(或者,在这种情况下,直到asp.net检测到它一遍又一遍地请求同一页面)。

首先:

protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
    String url = Request.ServerVariables["HTTP_REFERER"];
    if(!String.IsNullOrEmpty(url))
    {
        if (!url.ToUpper().Contains("CP.ASPX"))
        {
            Response.Redirect("http://a.sml.com.pk");
        }
        else if (!url.ToUpper().Contains("MILKSALE.ASPX") && !url.ToUpper().Contains("CP.ASPX"))
        {
            Response.Redirect("http://172.17.0.221:85/MilkSale.aspx");
        }
    }

   }        
} 

然后这将解决第一个问题。但是,您必须考虑代码的其他一些问题;

  1. 您正在进行不区分大小写的字符串匹配。
  2. 您的网址中有硬编码的IP地址
  3. 1)非常容易使用;例如,您可以使用String.Compare(url, referrer, StringComparison.InvariantCultureIgnoreCase)。在我的代码中,我使用了.ToUpper(),但这仍然充满了问题(但是做了一个紧凑的例子)

    2)更难;你应该真正取消你的重定向机制与根网址的关联,否则你每次更改网站时都必须更改你的代码。使用属性HttpContext.Current.Request.Url.PathAndQuery或者最好查看URL rewriting