我几年前创建了一个数据库驱动的ASP.NET站点,它使用单个APSX页面来显示所有站点页面.因此,网站的所有网址都采用以下格式:
/main.aspx?page=Page+Title+One /main.aspx?page=Another+Article+Title /main.aspx?page=Third+Page
main.aspx页面获取查询字符串数据(例如页面标题一),并将其用作从sql Server数据库中提取相应文章内容的关键字.页面的实际标题存储在db中,而不是空格(例如“页面标题1”).
在URL查询字符串中使用符号作为字分隔符的糟糕决定会导致最近的搜索引擎(重复的内容等)的许多问题,所以我想修复它,但不会更改URL.
我想做的是当搜索引擎或访问者尝试访问错误的网址时,错误的标志和空白的空格,例如:
/main.aspx?page=Page Title One
/main.aspx?page=Page+Title+One
为了能够这样做,我需要检查查询字符串值是否有空格或空格,但是当我使用Request.QueryString [“page”]获取值时,即使实际的quesry字符串有其中的优点,我仍然得到字符串与空白“页面标题一”.
该站点运行在IIS6 / Win 2003上.
我该怎么做?
解决方法
那么当然,你无法在URI中放置一个空格.你可以做些什么就是在URI中的任何一点对空格进行编码的方法,以及编码查询部分中的空格的正常方法,以及在该部分中建议的方法,因为可能会导致问题.
因为这是一个实现细节应用程序/ x-www-form-urlencoded,我们通常关心发送的实际数据,Request.QueryString []对你进行不间断的转换,将它们转换成一个空格.
你想查看Request.RawUrl(返回一个字符串)或者返回一个Uri的Request.Url.可能最简单的方法是将Request.Url提交到UriBuilder中,以便您只需更改查询并获取Uri.
不过,我建议采用相反的方法,如果由于在查询字符串中编码空间的两种可能方式,因此,如果您遇到重复内容的问题,请遵循推荐的规范,将案例转换为其他方式周围.
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(); }