2011-12-21 75 views
10

几年前,我创建了一个数据库驱动的ASP.NET网站,它使用单个APSX页面来显示所有网站页面。因此,网站的所有网址都采用以下格式:加号登录ASP.NET网站的查询字符串

/main.aspx?page=Page+Title+One 

/main.aspx?page=Another+Article+Title 

/main.aspx?page=Third+Page 

的main.aspx页面获取查询字符串数据(页+标题+一个例如),并使用它作为一个重点来拉动适当的文章来自SQL服务器数据库的内容。页面的实际标题以空格而不是加号存储在数据库中(例如“页面标题一”)。

在URL查询字符串中使用+号作为分隔符的糟糕决定最近导致搜索引擎出现很多问题(重复的内容等),所以我想修复它,但不更改URL 。

我想要做的是,当搜索引擎或访客试图访问错误的URL中缺少的+号,并具有白色空格代替,例如:

/main.aspx?page=Page Title One 

我想要做301永久重定向到:

/main.aspx?page=Page+Title+One 

为了能够做到这一点,我需要检查,如果查询字符串值有加号或空格,但是当我得到的Request.QueryString [“页”]的值即使实际quesry字符串有加上它我仍然得到字符串与白色空间“页标题一”。

该网站在IIS6/Win 2003上运行。

我该怎么做?

回答

2

嗯,当然在任何情况下你都不能在URI中放置空格。你可以做的是把%20放在其中,在URI中的任何一点上编码空间的方式,以及+是在查询部分中编码空间的常规方式,并且推荐的方式是在该部分它是因为%20可能会导致问题。

因为这是一个implementaiton细节应用程序/ x-WWW窗体-urlencoded和我们通常关心的实际发送的数据,Request.QueryString[]做的转义为你,把两者+%20进入的空间。

你想看看Request.RawUrl(返回一个字符串)或Request.Url,它返回Uri。可能最简单的方法是将Request.Url填入UriBuilder,这样您就可以更改查询并返回Uri

不过,我建议相反的方法,如果您遇到重复内容的问题,由于在查询字符串编码空间的两种可能的方式,去与建议规范转来转%20的情况下进入+而不是其他方式。

var u = Request.Url; 
if(u.Query.Contains("%20")) 
{ 
    var ub = new UriBuilder(u); 
    Console.WriteLine(ub.Query); 
    string query = ub.Query; 
    //note bug in Query property - it includes ? in get and expects it not to be there on set 
    ub.Query = ub.Query.Replace("%20", "+").Substring(1); 
    Response.StatusCode = 301; 
    Response.RedirectLocation = ub.Uri.AbsoluteUri; 
    Response.End(); 
} 
+0

我的网址一直只使用加号而不是空白或%20,但是我在Google中看到缓存页面,如下所示2:/main.aspx?page=KW1 KW2和/main.aspx?page=KW1% 20KW2,这两个都是错误的,并导致重复的内容问题。现在我想将它们301添加到/main.aspx?page=KW1+KW2的正确URL中。 – 2011-12-21 20:48:45

+0

这就是我正在解释的。不知道什么是不明确的,所以添加了希望解释的代码示例。 – 2011-12-21 20:59:24

+0

感谢Jon,这正是我需要的:)。我如何将问题标记为已回答? – 2011-12-21 21:08:56

3

+符号被解释为URL的空间。

也就是说,为了URL编码空间,您可以使用%20+

请参见this SO answer以“URL编码空格字符:+或%20?”

4

使用Request["key"]时,它会自动将所有“+”号转换为空格。您需要使用Request.RawUrl来查看是否有加号。

此外,您可以使用System.Web.HttpUtility.ParseQueryString解析任何字符串查询。 您可以测试Request.QueryString.ToString().Contains("+")是否为真,并从中执行逻辑。

+0

这正是我的问题。我希望能够区分以下2个GET请求:/main.aspx?page=KW1+KW2和/main.aspx?page=KW1 KW2。 – 2011-12-21 20:32:35

+0

查看我原来的帖子。看起来像'Request.QueryString.ToString()。Contains(“+”)'会给你,如果它的第一或第二种情况。 – 2011-12-21 20:41:20

+0

是的,但这不会以下面的格式/main.aspx?page=KW1 KW2 + KW3解决错误的URL。 – 2011-12-21 20:53:25

0

你可以试试这个:

Request.QueryString["page"].Trim();