`

【转】URL的井号

阅读更多

原文转自:http://www.ruanyifeng.com/blog/2011/03/url_hash.html

 

原来一直不知道Gmail在大量使用ajax时的后退按钮的生效是如何实现的,也比较懒,从来没有深究过,看了这篇文章终于明白了原来可以通过window.location.hash和onhashchange事件来实现,学习了!

 

作者: 阮一峰

日期: 2011年3月 9日

去年9月,twitter改版。

一个显著变化,就是URL加入了"#!"符号。比如,改版前的用户主页网址为

  http://twitter.com/username

改版后,就变成了

  http://twitter.com/#!/username

在我印象中,这是主流网站第一次将"#"大规模用于直接与用户交互的关键URL中。这表明井号(Hash)的作用正在被重新认识。本文根据HttpWatch 的文章,整理与井号有关的所有重要知识点。

一、#的涵义

#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,

  http://www.example.com/index.html#print

就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。

为网页位置指定标识符,有两个方法。一是使用锚点,比如<a name="print"></a>,二是使用id属性,比如<div id="print" >。

二、HTTP请求不包括#

#是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包括#。

比如,访问下面的网址,

  http://www.example.com/index.html#print

浏览器实际发出的请求是这样的:

  GET /index.html HTTP/1.1

  Host: www.example.com

可以看到,只是请求index.html,根本没有"#print"的部分。

三、#后的字符

在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。

比如,下面URL的原意是指定一个颜色值:

  http://www.example.com/?color=#fff

但是,浏览器实际发出的请求是:

  GET /?color= HTTP/1.1

  Host: www.example.com

可以看到,"#fff"被省略了。只有将#转码为%23,浏览器才会将其作为实义字符处理。也就是说,上面的网址应该被写成:

  http://example.com/?color=%23fff

四、改变#不触发网页重载

单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页。

比如,从

  http://www.example.com/index.html#location1

改成

  http://www.example.com/index.html#location2

浏览器不会重新向服务器请求index.html。

五、改变#会改变浏览器的访问历史

每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用"后退"按钮,就可以回到上一个位置。

这对于ajax应用程序特别有用,可以用不同的#值,表示不同的访问状态,然后向用户给出可以访问某个状态的链接。

值得注意的是,上述规则对IE 6和IE 7不成立,它们不会因为#的改变而增加历史记录。

六、window.location.hash读取#值

window.location.hash这个属性可读可写。读取时,可以用来判断网页状态是否改变;写入时,则会在不重载网页的前提下,创造一条访问历史记录。

七、onhashchange事件

这是一个HTML 5新增的事件,当#值发生变化时,就会触发这个事件。IE8+、Firefox 3.6+、Chrome 5+、Safari 4.0+支持该事件。

它的使用方法有三种:

  window.onhashchange = func;

  <body onhashchange="func();">

  window.addEventListener("hashchange", func, false);

对于不支持onhashchange的浏览器,可以用setInterval监控location.hash的变化。

八、Google抓取#的机制

默认情况下,Google的网络蜘蛛忽视URL的#部分。

但是,Google还规定 ,如果你希望Ajax生成的内容被浏览引擎读取,那么URL中可以使用"#!",Google会自动将其后面的内容转成查询字符串_escaped_fragment_的值。

比如,Google发现新版twitter的URL如下:

  http://twitter.com/#!/username

就会自动抓取另一个URL:

  http://twitter.com/?_escaped_fragment_=/username

通过这种机制,Google就可以索引动态的Ajax内容。

分享到:
评论

相关推荐

    url编码表,转换编码

    例如,空格(space)被编码为"%20",引号(")被编码为"%22",井号(#)被编码为"%23"。这个编码表包含了从ASCII码表中的每一个字符,包括控制字符(如backspace、tab、linefeed等)到常见的符号和特殊字符,一直到...

    URL重写URL重写URL重写

    **URL重写技术详解** URL重写是Web开发中一种重要的技术,主要用于优化网站的URL结构,使其更符合用户友好性和搜索引擎优化(SEO)的要求。简单来说,URL重写就是将用户请求的实际复杂URL转换为更加简洁、易读的...

    URL 编码文档

    不安全字符主要包括空格、引号("和')、尖括号(&lt;和&gt;)、井号(#)、百分号(%)、花括号({})、竖线(|)、反斜杠(\)、波浪线(^)、方括号([])、反引号(`)和波浪线(~)。空格通常会被转换为加号(+)或者...

    URL.rar_url_url解析

    6. **片段标识符**:以井号(#)分隔,用于在页面内部定位特定内容,如`#section1`。 **URL解析**是将一个完整的URL分解成这些组成部分的过程,这在很多场景下都是必要的,比如路由、数据请求和页面跳转。在...

    java URL的组成部分

    6. **片段标识符(Fragment Identifier)**:URL的最后部分可以是一个井号“#”,后面跟着片段标识符,它指示页面内的特定位置,但不会发送到服务器。例如,“#section1”会将浏览器滚动到页面的“section1”部分。 ...

    URL编码表一览

    `)、双引号(`"`)、井号(`#`)、美元符号(`$`)、百分号(`%`)、与号(`&`)、单引号(`'`)、左括号(`(`)、右括号(`)`)、星号(`*`)、加号(`+`)、逗号(`,`)、减号(`-`)、点号(`.`)、斜杠(`/`)。 - `%30`到`%39`代表数字`0`到...

    URL转码及不能被转码的特殊字符

    - “#”(井号)——用于分隔URL的主体与片段标识符。 - “=”(等号)——用于分隔查询字符串中的键值对。 - “&”(与号)——用于连接查询字符串中的多个参数。 这些字符在URL中具有特殊的语法意义,如果对其...

    url正则表达式

    - `片段标识符`(用于页面内部定位,用井号#标识,如#section1) 2. **URL正则表达式构建** 创建一个全面的URL正则表达式可能非常复杂,因为它需要考虑各种可选部分和特殊字符。以下是一个简化的示例: ``` ^...

    URL 编码转换工具

    例如,空格通常被转换为`%20`,而引号(`"`)、井字号(`#`)和与号(`&`)等字符也需要进行适当的编码。 "URL 编码转换工具"是一个专门用于处理URL编码和解码的应用软件,它能够帮助用户将字符串中的特殊字符转换为它们...

    URL分析示例程序

    6. **片段标识符**:以井号(#)分隔,用于页面内的定位,但不会被发送到服务器。 在"URL分析示例"程序中,可能包含以下功能: 1. **URL合法性检查**:验证输入的字符串是否符合URL的格式,包括检查协议、主机名、...

    我写的一个url

    6. **片段标识符**:用井号(#)分隔,如#section1,用于页面内部导航,不发送到服务器。 在描述中提到的“我写的url”,可能指的是创建了一个自定义的URL,这可能是为了特定的功能或者项目需求。创建自定义URL时,...

    python3处理含有中文的url方法

    默认值是`'/#'`,表示斜线、井号和空格不会被编码。如果我们希望保持更多的字符原样不变,可以自定义这个参数。 在给定的例子中,代码使用`string.printable`作为`safe`参数。`string.printable`是一个字符串,包含...

    url重写说明.doc

    在Apache的配置文件(如httpd.conf)中,找到`LoadModule rewrite_module modules/mod_rewrite.so`这一行,去掉前面的井号(#)取消注释,确保该模块被加载。 接着,我们需要允许`.htaccess`文件在我们的网站目录中...

    【基础篇】第06篇:PHP代码审计笔记--URL跳转漏洞1

    2. 前缀式:通过问号或井号添加额外信息,如`?url=http://www.evil.com?www.aaa.com`、`http://www.aaa.com?returnUrl=http://www.evil.com#www.aaa.com`。 3. 其他形式:使用反斜杠 `\` 进行绕过,如`?url=...

    易语言网码转换

    1. **特殊字符转义**:URL中的一些字符如空格、问号、井字号等有特殊含义,需要转换为%编码。 2. **非ASCII字符处理**:如果URL包含非英文字符,如中文、日文等,需要按照特定的编码规则(如UTF-8)转换为字节序列,...

    你知道url中的特殊符号含义么(比看篇)

    在这篇文章中,我们将重点讨论URL中的一些特殊符号的含义和用途,这些符号包括井号(#)和问号(?)等。 井号(#)在URL中用于指定网页内的位置标识符,它通常与锚点标签()一起使用来实现页面内部跳转。比如,URL *** ...

    URL中“#” “?” &“”号的作用浅析

    - **含义**:井号(#)用于标识网页内的特定位置,称为锚点。它后面的字符作为该位置的ID,浏览器会自动滚动到相应的位置。例如,`http://www.example.com/index.html#print` 将使浏览器跳转到页面中id为"print"的...

    两种方法解决javascript url post 特殊字符转义 + & #

    例如,加号 '+' 在URL中被解释为一个空格的替代,而井号 '#' 用于指定URL的锚点。这些特殊字符如果不经过适当的转义处理,就会被浏览器误认为是URL的一部分,从而导致原始数据无法正确传递。 对于URL中的特殊字符,...

    JS过滤url参数特殊字符的实现方法

    6. 井号(#): 表示书签,编码为 `%23`。 7. 和号(&): URL中指定的参数间的分隔符,编码为 `%26`。 8. 等号(=): URL中指定参数的值,编码为 `%3D`。 ### 使用replace()方法过滤特殊字符 JavaScript的`replace...

    关于URL中的特殊符号使用介绍

    1. `encodeURI()`:这个函数用于编码整个URI,但会保留一些特殊字符,比如冒号":"、井字号"#"、美元符号"$"、与符号"&"、单引号"' "、左括号"("、右括号")"、星号"*"、加号"+"、逗号","、减号"-"、点"."、斜线"/"、...

Global site tag (gtag.js) - Google Analytics