另外登录ASP.NET站点的查询字符串

Joh*_*ins 11 c# special-characters request.querystring

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

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

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

/main.aspx?page=Third+Page
Run Code Online (Sandbox Code Playgroud)

main.aspx页面获取查询字符串数据(例如,Page + Title + One),并将其用作从SQL Server数据库中提取相应文章内容的键.页面的实际标题存储在带空格而不是加号的数据库中(例如"Page Title One").

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

我想要做的是当搜索引擎或访问者试图访问错误的URL时,错过+符号并改为使用空格,例如:

/main.aspx?page=Page Title One
Run Code Online (Sandbox Code Playgroud)

我想做301永久重定向到:

/main.aspx?page=Page+Title+One
Run Code Online (Sandbox Code Playgroud)

为了能够做到这一点,我需要检查查询字符串值是否有加号或空格,但是当我使用Request.QueryString ["page"]得到值时,即使实际的问题字符串已经加入,我仍然得到字符串白色空间"页面标题一".

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

我怎样才能做到这一点?

Tom*_*ski 5

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

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


Jon*_*nna 2

当然,在任何情况下都不能在 URI 中添加空格。您可以做的是放入%20其中,这是在 URI 中的任何点对空格进行编码的方法,也是+在查询部分中对空格进行编码的正常方法,以及在该部分中执行此操作的推荐方法,因为%20 可能会导致问题。

因为这是一个实现细节 application/x-www-form-urlencoded ,我们通常关心发送的实际数据,Request.QueryString[]为您进行转义,将 和+%20变成一个空格。

您想查看Request.RawUrl(返回一个字符串) 或Request.Url返回一个Uri. 也许最简单的方法就是输入Request.Urla 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();
}
Run Code Online (Sandbox Code Playgroud)