我想采用原始URL,截断查询字符串参数,并返回URL的清理版本.我希望它在整个应用程序中发生,因此通过global.asax执行将是理想的.此外,我认为301重定向也是有序的.
即.
在:www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media
出:www.website.com/default.aspx
实现这一目标的最佳方法是什么?
此问题涉及URL的查询字符串部分中的?字符,这些字符出现在标记字符之后.
根据维基百科,某些字符保持原样,其他字符编码(通常带有%转义序列).
我一直试图将其跟踪到实际规格,以便我理解维基百科页面中每个要点背后的理由.
矛盾例1:
在HTML规范说来编码空间,+并按照其余RFC1738.但是,这个RFC说这~是不安全的,而且"[a] ll不安全的字符必须始终在URL中编码".这似乎与维基百科相矛盾.
实际上,IE8 ~在它生成的查询字符串中进行编码,而FF3则按原样进行编码.
矛盾示例2:
维基百科指出,它未提及的所有字符都必须进行编码.!在维基百科中没有提到.但是RFC1738声明这!是一个"特殊"字符并且"可以使用未编码的".这似乎与维基百科相矛盾,维基百科说它必须编码.
实际上,IE8 !在它生成的查询字符串中进行编码,而FF3则按原样进行编码.
据我所知,这可能是为了对那些在维基百科和规范之间存在疑问的字符进行编码.甚至可能编码所有不是[A-Za-z0-9]的东西.我想知道这方面的实际标准.
结论
维基百科上描述的算法精确编码那些不是RFC3986非保留字符的字符.也就是说,它编码除字母数字和字母之外的所有字符-._~.作为一种特殊情况,空间被编码为+而不是%20RFC3986.
某些应用程序使用较旧的RFC.为了比较,RFC2396无保留字符是字母数字和!'()*-._~.
为了比较,HTML5工作草案算法编码除字母数字和字母以外的所有字符*-._.空间的特殊情况编码仍然存在+.值得注意的差异*是未编码和~编码.(从技术上讲,这种处理*与RFC3986是兼容的,即使它*是在reserved因为它sub-delims在query生产中允许的范围内.)
虽然强烈建议(W3C源,通过维基百科)Web服务器支持分号作为URL查询项的分隔符(除了&符号),但似乎通常不会遵循.
例如,比较
http://www.google.com/search?q=nemo & OE = UTF-8
http://www.google.com/search?q=nemo ; OE = UTF-8
结果.(在后一种情况下,分号是,或者在撰写本文时,被视为普通的字符串字符,就像网址是:http://www.google.com/search?q = nemo %3B oe = utf-8)
虽然我尝试了第一个URL解析库,但表现良好:
>>> from urlparse import urlparse, query_qs
>>> url = 'http://www.google.com/search?q=nemo;oe=utf-8'
>>> parse_qs(urlparse(url).query)
{'q': ['nemo'], 'oe': ['utf-8']}
Run Code Online (Sandbox Code Playgroud)
接受分号作为分隔符的当前状态是什么,哪些是潜在的问题或一些有趣的注释?(从服务器和客户端的角度来看)
我在我的应用程序中创建了一个表单,如下所示:
<form action="/search/" method="get">
<input id="search-box" name="search" type="text" size=30 title="Search" value="" />
<input id="search-submit" type="image" alt="Search" src="/images/search-button.gif" />
</form>
Run Code Online (Sandbox Code Playgroud)
但是当我提交表单时,会创建如下URL:
mysitename.com/search/?search=hello&x=0&y=0
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么这个x和y来自我的URL.如果我正在更改下面的表单代码,那么更多的东西而不是图像按钮然后它的工作正常,
<form action="/search/" method="get">
<input id="search-box" name="search" type="text" size=30 title="Search" value="" />
<input id="search-submit" type="submit" value="Search"/>
</form>
Run Code Online (Sandbox Code Playgroud)
但是我需要一个图像按钮才能让我的表格看起来很棒.请告诉我如何从URL中删除这些x和y参数.
我正在努力建立一个宁静的API,我正在努力如何将JSON数据序列化为HTTP query string.
需要在请求中传递许多强制和可选参数,例如(在下面表示为JSON对象):
{
"-columns" : [
"name",
"column"
],
"-where" : {
"-or" : {
"customer_id" : 1,
"services" : "schedule"
}
},
"-limit" : 5,
"return" : "table"
}
Run Code Online (Sandbox Code Playgroud)
我需要支持不同数量的不同客户端,所以我正在寻找一种标准化的方法将这个json对象转换为查询字符串.有一个,它看起来怎么样?
另一种方法是允许用户只是传递消息体中的json对象,但我读到我应该避免它(带请求体的HTTP GET).
有什么想法吗?
编辑以澄清:
列出一些不同的语言如何编码上面给定的json对象:
jQueryusing $.param:-columns [] = name&-columns [] = column&-where [-or] [customer_id] = 1&-where [-or] [services] = schedule&-limit = 5&return = columnPHPusing http_build_query:-columns [0] = name&-columns [1] = column&-where [-or] [customer_id] …我有一个javascript函数,它作为查询字符串值传递另一个查询字符串.
换句话说,我希望查询字符串为:
http://www.somesite.com/?somequery=%3fkey%3dvalue1%2520%26%2520key2%3value3
Run Code Online (Sandbox Code Playgroud)
但是,如果我像这样重定向:
var url = 'http://www.somesite.com/?somequery=';
url += escape('?key=value1&key2=value2');
window.location = url;
Run Code Online (Sandbox Code Playgroud)
它最终http://www.somesite.com?somequery=?key1=value1&key2=value2在firefox和IE7中,这意味着我无法正确解析查询字符串.
我也试过使用encodeURIComponent也没用.
是否有另一个函数或黑客强制重定向保持somequery值逃脱?
我一直在遇到一个问题,这个问题是通过谷歌adwords推动的营销活动揭示出来的.使用的标准参数之一是"区域".当用户搜索并点击赞助商链接时,Google会生成一个长URL来跟踪点击,并在引荐来源中发送大量内容.我们捕获了这些记录,我们注意到"Region"参数输入错误.应该是什么
http://ravercats.com/meow?foo=bar®ion=catnip
Run Code Online (Sandbox Code Playgroud)
而是通过以下方式:
http://ravercats.com/meow?foo=bar®ion=catnip
Run Code Online (Sandbox Code Playgroud)
我已经证实这种情况发生在所有浏览器中.我的理解是HTML实体语法定义如下:
&VALUE;
Run Code Online (Sandbox Code Playgroud)
其中前导边界是&符号,闭合边界是分号.看起来很简单.问题是,这个实体并没有得到尊重,而且它在整个系统中造成了各种各样的破坏.
有谁知道为什么会这样?这是DTD中的错误吗?(我正在寻找当前的HTML DTD以确定我是否可以理解它)我正在试图找出跨浏览器的常见情况,以便实现这一点,因此我在寻找DTD.
这是您可以使用的证明.获取此代码,从中制作HTML文件并在浏览器中呈现它:
<html>
<a href="http://foo.com/bar?foo=bar®ion=US®ister=lowpass®_test=fail&trademark=correct">http://foo.com/bar?foo=bar®ion=US®ister=lowpass®_test=fail&trademark=correct</a>
</html>
Run Code Online (Sandbox Code Playgroud)
编辑:对于那些建议我需要转义整个网址的人来说,上面的示例网址就是这样的例子.真正的网址直接来自Google,我无法控制它的构建方式.这些建议虽然有效,却没有回答这个问题:"为什么会这样?"
假设我有带有查询字符串参数的URL,如下所示:
/index.php?book=DesignPatterns&page=139
/index.php?book=Refactoring&page=285
Run Code Online (Sandbox Code Playgroud)
使用mod_rewrite,如何将它们重定向到这些SES URL?
/DesignPatterns/139
/Refactoring/285
Run Code Online (Sandbox Code Playgroud) 在网址的某处有一个&sortBy = 6.如何在单击按钮时将其更新为&sortBy = 4或&sortBy = 2?我是否需要编写自定义字符串函数来创建正确的重定向网址?
如果我只需要附加一个查询字符串变量,我会这样做
string completeUrl = HttpContext.Current.Request.Url.AbsoluteUri + "&" + ...
Response.Redirect(completeUrl);
Run Code Online (Sandbox Code Playgroud)
但我想要做的是修改现有的querystring变量.