几年前,我创建了一个数据库驱动的ASP.NET站点,该站点使用单个APSX页面显示所有站点页面。因此,该网站的所有网址都采用以下格式:
/main.aspx?page=Page+Title+One
/main.aspx?page=Another+Article+Title
/main.aspx?page=Third+Page
main.aspx页面获取查询字符串数据(例如,Page + Title + One),并将其用作从SQL Server数据库中提取相应文章内容的键。页面的实际标题存储在数据库中,带有空格而不是加号(例如“Page Title One”)。
在URL查询字符串中使用+号作为单词分隔符的糟糕决定导致最近搜索引擎出现很多问题(重复内容等),因此我想修复它,但不更改URL。
我想要做的是当搜索引擎或访问者尝试访问错误的网址而忽略+符号并改为使用空格时,例如:
/main.aspx?page=Page Title One
我想将301永久重定向到:
/main.aspx?page=Page+Title+One
为了能够做到这一点,我需要检查查询字符串值是否有加号或空格,但是当我使用Request.QueryString [“page”]得到值时,即使实际的问题字符串已经加入了它我仍然得到带有空格的字符串“Page Title One”。
该网站在IIS6 / Win 2003上运行。
我该怎么做?
答案 0 :(得分:5)
使用Request["key"]
,它会自动将所有“+”符号转换为空格。您需要使用Request.RawUrl
来查看是否有加号。
此外,您可以使用System.Web.HttpUtility.ParseQueryString
来解析任何字符串查询。
你可以测试Request.QueryString.ToString().Contains("+")
是否为真,并从那里做逻辑。
答案 1 :(得分:3)
答案 2 :(得分:2)
嗯,当然,在任何情况下都不能在URI中放置空格。您可以做的是将%20
放在URI中任何一点的空间编码方式中,+
是在查询部分中编码空格的常规方法,推荐使用这样做的方法是因为%20会导致问题。
由于这是一个实施详细的应用程序/ x-www-form-urlencoded,我们通常关心发送的实际数据,Request.QueryString[]
为你做了一次unescaping,转而+
和{{ 1}}进入一个空间。
您想要查看%20
(返回字符串)或Request.RawUrl
,它会返回Request.Url
。可能最简单的方法是将Uri
提供给Request.Url
,这样您就可以更改查询并获得UriBuilder
。
但是,我建议使用相反的方法,如果由于在查询字符串中编码空格的两种可能方法而导致重复内容出现问题,请使用建议的范数并转换{{1进入Uri
而不是相反。
%20
答案 3 :(得分:0)
你可以试试这个:
Request.QueryString["page"].Trim();