加号在查询字符串的ASP.网的网站

本文关键字:ASP 网站 字符串 查询 | 更新日期: 2023-09-27 18:18:28

几年前我创建了一个数据库驱动的ASP。NET站点,它使用单个APSX页面来显示所有站点页面。因此,该网站的所有url都采用以下格式:

/main.aspx?page=Page+Title+One
/main.aspx?page=Another+Article+Title
/main.aspx?page=Third+Page

主。aspx页获取查询字符串数据(例如page +Title+One),并使用它作为键从SQL server数据库中提取适当的文章内容。页面的实际标题存储在数据库中,使用空格而不是加号(例如"page title One")。

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

我想做的是当搜索引擎或访问者试图访问错误的URL缺少+号和空白代替,例如:

/main.aspx?page=Page Title One
我想做301永久重定向到:
/main.aspx?page=Page+Title+One

为了能够做到这一点,我需要检查查询字符串值是否有加号或空格,但是当我获得请求值时。QueryString["page"]即使实际的查询字符串中有加号,我仍然得到带有空白的字符串"page Title One"。

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

我该怎么做?

加号在查询字符串的ASP.网的网站

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

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

+符号被解释为url的空格。

也就是说,为了对空格进行URL编码,您可以使用%20+

看到这个SO回答"URL编码空格字符:+还是%20?"

当然,在任何情况下都不能在URI中放置空格。您可以做的是将%20放在其中,这是在URI中任何点编码空间的方式,而+是在查询部分中编码空间的正常方式,并且推荐在该部分中这样做,因为%20可能会导致问题。

因为这是一个实现细节application/x-www-form-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();
}

你可以试试:

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