我想知道这两种类型的url之间的区别:相对url(图片,CSS文件,JS文件等)和绝对url。
另外,用哪个比较好呢?
一般来说,使用相对URL被认为是最佳实践,这样你的网站就不会被绑定到当前部署的基础URL。例如,它可以在本地主机上工作,也可以在您的公共域上工作,而无需修改。
在大多数情况下,相对url是可行的,它们本质上是可移植的,这意味着如果您想提升您的站点并将其放在其他地方,它将立即工作,可能会减少调试时间。
有一个相当不错的关于绝对和相对url的文章,来看看。
假设你有一个站点www.yourserver.example。在web文档的根目录中有一个images子目录,其中有myimage.jpg。
www.yourserver.example
绝对URL定义了文档的确切位置,例如:
http://www.yourserver.example/images/myimage.jpg
一个相对URL定义了位置相对于当前目录,例如,假设你在你的图片所在的根目录:
images/myimage.jpg
(相对于根目录)
你应该尽可能使用相对url。如果你将站点移动到www.anotherserver.com,你将不得不更新所有指向www.yourserver.example的绝对url,相对url将继续工作。
如果是在你的网站中使用,最好使用相对URL,如果你需要将网站移动到另一个域名或只是在本地调试,你可以这样做。
看看stackoverflow在做什么(firefox中的ctrl+U):
<a href="/users/recent/90691"> // Link to an internal element
在某些情况下,他们使用绝对url:
<link rel="stylesheet" href="http://sstatic.net/so/all.css?v=5934">
... 但这只是提高速度的最佳做法。在你的情况下,你看起来不像这样做,所以我不会担心。
看这个:http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax
foo://username:password@example.com:8042/over/there/index.dtb;type=animal?name=ferret#nose \ / \________________/\_________/ \__/ \___/ \_/ \_________/ \_________/ \__/ | | | | | | | | | | userinfo hostname port | | parameter query fragment | \_______________________________/ \_____________|____|____________/ scheme | | | | | authority |path| | | | | path interpretable as filename | ___________|____________ | / \ / \ | urn:example:animal:ferret:nose interpretable as extension
绝对URL包括“路径”之前的部分;part——换句话说,它包括方案(http://foo/bar/baz中的http)和主机名(http://foo/bar/baz中的foo)(还有可选的端口、用户信息和端口)。
http://foo/bar/baz
http
foo
相对url以路径开头。
绝对URL是绝对的:资源的位置可以仅通过URL本身来解析。相对URL在某种意义上是不完整的:要解析它,您需要方案和主机名,而这些通常来自当前上下文。例如,在网页中
http://myhost/mypath/myresource1.html
你可以这样放一个链接
<a href="pages/page1">click me</a>
在链接的href属性中,使用了一个相对url,如果它被单击,则必须解析它以便跟随它。在本例中,当前上下文为
href
因此,它们的模式、主机名和前导路径将被取并前置到pages/page1,从而产生
pages/page1
http://myhost/mypath/pages/page1
如果链接是:
<a href="/pages/page1">click me</a>
(注意/出现在URL的开头),那么它将被解析为
/
http://myhost/pages/page1
因为前面的/表示主机的根。
在一个web应用程序中,我建议对属于你的应用程序的所有资源使用相对url。这样,如果你改变了页面的位置,一切都将继续工作。任何外部资源(可以是完全在应用程序之外的页面,也可以是通过内容交付网络交付的静态内容)应该始终使用绝对url指向:如果不这样做,则根本无法定位它们,因为它们驻留在不同的服务器上。
以URL方案和方案特定部分(http://, https://, ftp://等)开头的URL是绝对URL。
http://
https://
ftp://
任何其他URL都是相对URL,并且需要一个基本URL,相对URL是从引用所使用的资源的URL中解析出来的(因此依赖于),如果没有声明的话。
看看RFC 2396 -附录C中解析相对url的例子。
我衷心推荐使用相对url将同一站点的部分指向同一站点的其他部分。
不要忘记,即使在同一个站点中,更改到HTTPS也需要一个绝对URL。
我不同意大多数人的观点。
我认为相对的URL方案是“很好的”。当你想要快速启动和运行一些东西,而不是跳出框框思考时,特别是如果你的项目很小,只有几个开发人员(或者只有你自己)。
然而,一旦您开始在大型的、臃肿的系统上工作,并且一直在切换域和协议,我相信一种更优雅的方法是合适的。
当你从本质上比较绝对和相对url时,绝对url胜出。为什么?因为它永远不会坏。永远。绝对URL就是它所描述的那样。问题是你必须维护你的绝对url。
绝对URL链接的弱方法实际上是硬编码整个URL。这不是一个好主意,而且可能是人们认为维护它们危险/邪恶/讨厌的罪魁祸首。更好的方法是编写一个易于使用的URL生成器。这些都很容易编写,并且可以是令人难以置信的强大-自动检测您的协议,易于配置(字面上设置整个应用程序的url一次),等等,它自己注入您的域。这样做的好处是:您继续使用相对url进行编码,在运行时应用程序会动态地将您的url作为完全的绝对url插入。太棒了。
鉴于所有现代网站实际上都使用某种动态后端,这样做对网站最有利。绝对url的作用不仅仅是让你确定它们指向哪里——它们还可以提高SEO性能。
我还要补充一点,绝对url会以某种方式改变页面加载时间的说法是无稽之谈。如果你的域名超过几个字节,而且你在上世纪80年代使用拨号调制解调器,那当然可以。但现在情况已经不同了。https://stackoverflow.com/是25字节,而“topbar-sprite.png”;他们用于网站导航区域的文件大小为9+ kb。这意味着与精灵文件相比,额外的URL数据只占加载数据的0.2%,而该文件甚至不会被认为是一个大的性能打击。
大的,未优化的,整个页面的背景图像更有可能减慢你的加载时间。
例如,可能会出现的一个问题是,有时服务器映射(请注意大型、混乱的项目)与文件名不一致,开发人员可能会对相对URL做出不正确的假设。我今天在我参与的一个项目上看到了这个,它把整个页面都拖下来了。
或者开发人员忘记切换指针,突然谷歌索引了整个测试环境。唉,重复的内容(不利于搜索引擎优化!)
绝对可能是危险的,但如果使用得当,并以不能打破你的构建的方式使用,它们被证明是更可靠的。看看上面的文章,它给出了一堆为什么Wordpress url生成器超级棒的理由。
:)
如果你所说的绝对url指的是包括方案(例如HTTP / HTTPS)和主机名(例如yourdomain.example)在内的url,那么(对于本地资源)就永远不会这样做,因为维护和调试会很糟糕。
yourdomain.example
假设你在代码中处处使用了绝对URL,比如<img src="http://yourdomain.example/images/example.png">。现在,当你要去的时候,会发生什么:
<img src="http://yourdomain.example/images/example.png">
test.yourdomain.example
在第一个例子中,您将收到关于页面上正在请求的不安全内容的警告。因为你所有的url都是硬编码使用http(://yourdomain.example/images/example.png)。当通过HTTPS运行页面时,浏览器期望所有资源都通过HTTPS加载,以防止信息泄露。
在第二个例子中,当你把你的网站从测试环境中上线时,这意味着所有的资源仍然指向你的测试域,而不是你的上线域。
因此,为了回答您关于使用绝对url还是相对url的问题:始终使用相对url(用于本地资源)。
首先让我们来看看我们可以使用的不同类型的url:
http://yourdomain.example/images/example.png
//yourdomain.example/images/example.png
/images/example.png
images/example.png
在下面的例子中,我假设网站从服务器/var/www/mywebsite上的以下位置运行。
/var/www/mywebsite
上面的(绝对)URL尝试访问资源/var/www/website/images/example.png。这种类型的URL是你总是想要避免从你自己的网站请求资源的原因如上所述。然而,它确实有它的位置。例如,如果你有一个网站http://yourdomain.example,你想通过HTTPS从外部域请求资源,你应该使用这个。例如https://externalsite.example/path/to/image.png。
/var/www/website/images/example.png
http://yourdomain.example
https://externalsite.example/path/to/image.png
这个URL是相对的,基于当前使用的方案,当包含外部资源(图像,javascript等)时几乎总是应该使用。
<img src="//yourdomain.example/images/example.png">
https://yourdomain.example/images/example.png
这可以防止在不需要时通过HTTPS加载资源,并自动确保在是需要时通过HTTPS请求资源。
上面的URL在服务器端的解析方式与前面的URL相同:
上面的(绝对)URL尝试访问资源/var/www/website/images/example.png。
对于本地资源,这是首选的引用方式。这是一个基于你的网站的文档根(/var/www/mywebsite)的相对URL。这意味着当你有<img src="/images/example.png">时,它将总是解析为/var/www/mywebsite/images/example.png。
<img src="/images/example.png">
/var/www/mywebsite/images/example.png
如果在某个时候你决定切换域,它仍然可以工作,因为它是相对的。
这也是一个相对URL,尽管与前一个略有不同。这个URL相对于当前路径。这意味着它将解析到不同的路径,这取决于您在站点中的位置。
例如,当你在页面http://yourdomain.example上并且你使用<img src="images/example.png">时,它会像预期的那样在服务器上解析为/var/www/mywebsite/images/example.png,然而当你在页面http://yourdomain.example/some/path上并且你使用完全相同的图像标记时,它会突然解析为/var/www/mywebsite/some/path/images/example.png。
<img src="images/example.png">
http://yourdomain.example/some/path
/var/www/mywebsite/some/path/images/example.png
在请求外部资源时,您很可能希望使用相对于方案的URL(除非您希望强制使用不同的方案),而在处理本地资源时,您希望使用基于文档根的相对URL。
文档示例:
<!DOCTYPE html> <html> <head> <title>Example</title> <link href='//fonts.googleapis.com/css?family=Lato:300italic,700italic,300,700' rel='stylesheet' type='text/css'> <link href="/style/style.css" rel="stylesheet" type="text/css" media="screen"></style> </head> <body> <img src="/images/some/localimage.png" alt=""> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" ></script> </body> </html>
对于支持相对URI解析的每个系统,相对URI和绝对URI都服务于同一个目标:引用。它们可以互换使用。所以你可以在每一个情况下做出不同的决定。从技术上讲,它们提供了相同引用。
确切地说,每个相对URI都有一个绝对URI。那是那个相对URI被解析的base-URI。所以相对URI实际上是绝对URI之上的一个特性。
这也是为什么使用相对URI时,你可以像单独使用绝对URI一样执行更多的——这对于静态网站尤其重要,否则与绝对URI相比,静态网站的维护就不那么灵活了。
相对URI解析的这些积极影响也可以用于动态web应用程序开发。在动态环境中,绝对URI引入的不灵活性也更容易应对,因此对于一些不确定URI解析以及如何正确实现和管理它的开发人员(并不是说它总是容易的),通常会选择在网站的动态部分使用绝对URI,因为他们可以引入其他动态特性(例如包含URI前缀的配置变量),从而解决不灵活性。
那么使用绝对uri的好处是什么呢?技术上没有,但我想说的是:相对uri更复杂,因为它们需要针对所谓的绝对基uri进行解析。即使分辨率是多年来严格定义的,您可能会运行一个在URI分辨率上有错误的客户端。因为绝对URI不需要任何解析,所以使用绝对URI不会有遇到相对URI解析的错误客户端行为的风险。那么这种风险到底有多高呢?嗯,非常罕见。我只知道有一个互联网浏览器存在相对URI解析问题。这不是一般情况,只是在一个非常(模糊)的情况下。
与HTTP客户端(浏览器)相比,对于超文本文档或代码的作者来说,它可能更加复杂。在这里,绝对URI的好处是更容易测试,因为您只需将其原样输入到浏览器的地址栏中。然而,如果这不仅仅是您一个小时的工作,那么实际理解绝对和相对URI处理通常对您更有好处,这样您就可以真正利用相对链接的好处。
实际上有三种类型需要明确讨论。在实践中,虽然URL已经被抽象为在较低的级别上处理,但我想说的是,开发人员可以一辈子都不用手写一个URL。
绝对url将代码绑定到协议和域。这可以通过动态url解决。
<a href=“https://dev.example.com/a.html?q=”>https://dev.example.com/a.html?q=</a>
绝对的优点:
Control -可以控制子域和协议。通过模糊子域进入的人将被引导到正确的子域。您可以根据需要在安全的和非安全的之间来回切换。
可配置的 -开发人员喜欢绝对的东西。使用绝对url时,可以设计简洁的算法。URL可以是可配置的,这样只需在单个配置文件中进行一次更改,就可以在站点范围内更新URL。
千里眼 -你可以搜索抓取你网站的人,或者可能会获得一些额外的外部链接。
根相对url将您的代码绑定到基url。这可以通过动态url和/或基础标签来克服。
<a href=“/index.php?q=”>.example.com/index.php?q=</a>
根相对优点:
相对url将代码绑定到目录结构。这是无法克服的。相对url仅在文件系统中用于遍历目录或作为低级任务的快捷方式。
<a href=“index.php?q=”>index.php?q=</a> <link src=“../.././../css/default.css” />
相对的缺点:
混乱 -这是多少个点?有多少个文件夹?文件在哪里?为什么它不工作?
MAINTENANCE -如果文件被意外移动资源退出加载,链接将用户发送到错误的页面,表单数据可能被发送到错误的页面。如果一个文件需要被移动,所有的资源将退出加载和所有的链接将是不正确的需要更新。
当网页变得更加复杂,视图开始在多个页面上重复使用时,相对链接将相对于包含它们的文件。如果你在每个页面上都有一个HTML导航片段那么相对会是相对于很多不同的地方。当人们开始创建模板时,首先意识到的是他们需要一种管理url的方法。
COMPUTED -它们由您的浏览器实现(希望根据RFC)。参见RFC3986中的第5章。
< >强哦! -错误或拼写错误会导致蜘蛛陷阱。
开发人员已经停止编写这里所讨论的url。所有的请求都是针对一个网站的索引文件,并包含一个查询字符串,也就是路由。路由可以看作是一个迷你URL,它告诉应用程序要生成的内容。
<a href="<?=Route::url('named_url', array('first' => 'my', 'last' => 'whacky'))?>"> http://dev.example.com/index.php/my:whacky:url </a>
路线的优点:
大多数人会在他们的项目中以某种方式使用这三种形式。关键是要了解它们,并选择最适合这项任务的一个。
假设我们正在创建一个子站点,其文件位于文件夹http://site.ru/shop中。
Link to home page href="http://sites.ru/shop/" Link to the product page href="http://sites.ru/shop/t-shirts/t-shirt-life-is-good/"
Link from home page to product page href="t-shirts/t-shirt-life-is-good/" Link from product page to home page href="../../"
虽然相对URL看起来比绝对URL短,但绝对URL更可取,因为链接可以在网站的任何页面上使用。
我们考虑了两种极端情况:“绝对”绝对url和“绝对”相对url。但在这个世界上,一切都是相对的。这也适用于url。每次提到绝对URL时,都应该指定相对于什么。
Link to home page href="//sites.ru/shop/" Link to product page href="//sites.ru/shop/t-shirts/t-shirt-life-is-good/"
谷歌推荐这样的URL。然而,现在通常认为http://和https://是不同的网站。
即相对于域的根文件夹。
Link to home page href="/shop/" Link to product page href="/shop/t-shirts/t-shirt-life-is-good/"
如果所有页面都在同一个域中,这是一个很好的选择。当你把你的网站转移到另一个域名时,你不必在url中做大量的域名替换。
吊牌<底座>指定基本URL,它会自动添加到所有相对链接和锚点。base标记不影响绝对链接。作为基本URL,我们将指定主页:<base href="http://sites.ru/shop/">
Link to home page href="" Link to product page href="t-shirts/t-shirt-life-is-good/"
对于内部链接,我使用基本相对url(5),对于外部链接和时事通讯,我使用绝对url(1)。