加号在查询字符串的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上。
我该怎么做?
使用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();