绝对vs相对URL

时间:2010-01-05 09:30:07

标签: html url

我想知道这两种类型的URL之间的区别:相对URL(用于图片,CSS文件,JS文件等)和绝对URL。

另外,哪一个更好用?

12 个答案:

答案 0 :(得分:194)

我应该使用绝对或相对URL吗?

如果绝对URL是指包括方案(例如http / https)和主机名(例如yourdomain.com)的URL,则不会这样做(对于本地资源),因为维护和调试会很糟糕。

假设您在代码中的所有地方都使用了绝对网址,例如<img src="http://yourdomain.com/images/example.png">。现在,当你要去的时候会发生什么:

  • 切换到另一个方案(例如http - > https)
  • 切换域名(test.yourdomain.com - &gt; yourdomain.com)

在第一个示例中,您将收到有关在页面上请求的不安全内容的警告。因为您的所有网址都是硬编码的,所以使用http(://yourdomain.com/images/example.png)。当通过http运行您的页面时,浏览器希望通过https加载所有资源以防止泄露信息。

在第二个示例中,当您的网站从测试环境中直播时,这意味着所有资源仍然指向您的测试域而不是您的实时域。

所以回答你关于是否使用绝对或相对URL的问题:始终使用相对URL(对于本地资源)。

不同的网址有什么区别?

首先让我们看一下我们可以使用的不同网址:

  • http://yourdomain.com/images/example.png
  • //yourdomain.com/images/example.png
  • /images/example.png
  • images/example.png

这些URL尝试在服务器上访问哪些资源?

在下面的示例中,我假设网站是从服务器/var/www/mywebsite上的以下位置运行。

<强> http://yourdomain.com/images/example.png

上述(绝对)网址尝试访问资源/var/www/website/images/example.png。由于上述原因,此类网址是始终希望避免从您自己的网站请求资源的内容。但它确实有它的位置。例如,如果您有一个网站http://yourdomain.com并且您想通过http从外部域请求资源,那么您应该使用它。例如。 https://externalsite.com/path/to/image.png

<强> //yourdomain.com/images/example.png

此URL基于当前使用的方案是相对的,并且在包含外部资源(图像,javascripts等)时几乎总是应该使用。

这种类型的URL的作用是使用它所在页面的当前方案。这意味着您位于http://yourdomain.com页面上,该页面上的图片代码为<img src="//yourdomain.com/images/example.png">,图片的网址将在http://yourdomain.com/images/example.png中解析。
当您进入页面http**s**://yourdomain.com并且该页面上有图片代码<img src="//yourdomain.com/images/example.png">时,图片的网址将在https://yourdomain.com/images/example.png中解析。

这可以防止在不需要时通过https加载资源,并在 需要时自动确保通过https请求资源。

上述URL在服务器端以与上一个URL相同的方式解析:

  

上述(绝对)网址尝试访问资源/var/www/website/images/example.png

<强> /images/example.png

对于本地资源,这是引用它们的首选方式。这是基于您网站的文档根目录(/var/www/mywebsite)的相对URL。这意味着当您拥有<img src="/images/example.png">时,始终将解析为/var/www/mywebsite/images/example.png

如果您在某个时候决定切换域,它仍然有效,因为它是相对的。

<强> images/example.png

这也是一个相对URL,虽然与前一个有点不同。此URL与当前路径相关。这意味着它将根据您在站点中的位置解析到不同的路径。

例如,当您在页面http://yourdomain.com上并且使用<img src="images/example.png">时,它会按预期在服务器上解析为/var/www/mywebsite/images/example.png,但是当您在页面上时http://yourdomain.com/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>

一些(有点)重复

答案 1 :(得分:170)

通常,最佳做法是使用相对URL,以便您的网站不会绑定到当前部署的基本URL。例如,它可以在localhost上以及在您的公共域上工作,而无需修改。

答案 2 :(得分:59)

请参阅: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

绝对网址包含“路径”部分之前的部分 - 换句话说,它包含方案(http中的http://foo/bar/baz)和主机名(foo位于{ {1}})(以及可选的端口,用户信息和端口)。

相对网址以路径开头。

绝对网址是绝对的:资源的位置只能在网址本身查找。相对URL在某种意义上是不完整的:要解决它,您需要方案和主机名,这些通常取自当前上下文。例如,在

的网页中
http://foo/bar/baz

你可以放一个像这样的链接

http://myhost/mypath/myresource1.html

在链接的<a href="pages/page1">click me</a> 属性中,使用了相对URL,如果单击它,则必须解析它以便遵循它。在这种情况下,当前上下文是

href

所以这些的架构,主机名和前导路径都被带到http://myhost/mypath/myresource1.html ,并产生

pages/page1

如果链接是:

http://myhost/mypath/pages/page1

(注意出现在网址开头的<a href="/pages/page1">click me</a> )然后它就会被解析为

/

因为前导http://myhost/pages/page1 表示主机的根目录。

在网络应用程序中,我建议对属于您应用的所有资源使用相对网址。这样,如果您更改页面的位置,一切都将继续工作。任何外部资源(可能是完全在您的应用程序之外的页面,也是您通过内容传送网络提供的静态内容)应始终使用绝对URL指向:如果您不这样做,则根本无法找到它们,因为它们驻留在不同的服务器上。

答案 3 :(得分:38)

假设我们正在创建一个子网站,其文件位于文件夹http://site.ru/shop

1。绝对网址

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/"

2。相对网址

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更可取,因为链接可以在站点的任何页面上不加改变地使用。

中级案例

我们考虑过两种极端情况:&#34;绝对&#34;绝对的&#34;绝对&#34;相对URL。但在这个世界上,一切都是相对的。这也适用于URL。每当你说绝对URL时,你应该总是指定相对于什么。

3。协议相对URL

Link to home page
href="//sites.ru/shop/"

Link to product page
href="//sites.ru/shop/t-shirts/t-shirt-life-is-good/"

Google建议使用此类网址。但是,现在通常认为http://和https://是不同的站点。

4。根相对URL

即。相对于域的根文件夹。

Link to home page
href="/shop/"

Link to product page
href="/shop/t-shirts/t-shirt-life-is-good/"

如果所有页面都在同一个域中,那么这是一个不错的选择。当您将网站移动到其他域时,您不必在网址中大量替换域名。

5。基础相对URL(主页相对)

标签&lt; base&gt;指定基本URL,该URL自动添加到所有相关链接和锚点。基本标记不会影响绝对链接。作为基本网址,我们将指定主页:&lt; base href =&#34; http://sites.ru/shop/"&gt;。

Link to home page
href=""

Link to product page
href="t-shirts/t-shirt-life-is-good/"

现在,您不仅可以将网站移动到任何域,还可以移动到任何子文件夹中。请记住,尽管URL看起来像是相对的,但事实上它们是绝对的。 特别要注意锚点。要在当前页面中导航,我们必须编写href =&#34; t-shirts / t-shirt-life-is-good /#comments&#34;不是href =&#34;#comments&#34;。后者将放在主页上。

结论

对于内部链接,我使用基本相对URL(5)。对于外部链接和新闻简报,我使用绝对URL(1)。

答案 4 :(得分:24)

有三种类型应该明确讨论。实际上虽然URL被抽象化以便在较低级别处理,但我甚至可以说开发人员可以完成整个生命而无需手动编写单个URL。

绝对

绝对URL将您的代码绑定到协议和域。这可以通过动态URL来克服。

<a href=“https://dev.example.com/a.html?q=”>https://dev.example.com/a.html?q=</a>

绝对优点:

  1. 控制 - 可以控制子域和协议。通过一个不起眼的子域进入的人将被汇入正确的子域。您可以根据需要在安全和非安全之间来回跳转。

  2. 可配置 - 开发人员喜欢绝对的东西。使用绝对URL时,您可以设计整洁的算法。 URL可以进行配置,以便只需在单个配置文件中进行一次更改即可在站点范围内更新URL。

  3. 千里眼 - 您可以搜索抓取您网站的人或者选择一些额外的外部链接。


  4. Root Relative

    根相对网址将您的代码绑定到基本网址。这可以通过动态网址和/或base tags来解决。

    <a href=“/index.php?q=”>.example.com/index.php?q=</a>
    

    Root Relative Pros:

    1. 可配置 - 基本标记使它们相对于您选择的任何根目录,从而轻松实现切换域和实施模板。

    2. 相对

      相对URL将您的代码绑定到目录结构。没有办法克服这一点。相对URL仅在文件系统中用于遍历目录或作为琐事任务的快捷方式。

      <a href=“index.php?q=”>index.php?q=</a>
      <link src=“../.././../css/default.css” />
      

      相对缺点:

      1. ConfUSING - 这是多少个点?这是多少个文件夹?文件在哪里?为什么它不起作用?

      2. MAINTENANCE - 如果文件被意外移动,资源退出加载,链接会将用户发送到错误的页面,表单数据可能会被发送到错误的页面。如果要移动文件NEEDS,则需要更新所有要退出加载的资源以及所有不正确的链接。

      3. 无法扩展 - 当网页变得更加复杂并且视图开始在多个页面中重复使用时,相对链接将相对于它们所包含的文件。如果你有一个HTML的导航片段将在每个页面上,那么亲戚将相对于许多不同的地方。人们开始创建模板时首先意识到他们需要一种方法来管理URL。

      4. COMPUTED - 它们由您的浏览器实现(希望根据RFC)。请参阅RFC3986中的第5章。

      5. OOPS! - 错误或拼写错误会导致蜘蛛陷阱。


      6. 路线的演变

        开发人员已经停止在此处讨论的意义上编写URL。所有请求都是针对网站的索引文件,并包含查询字符串,即路径。该路线可以被视为一个迷你URL,告诉您的应用程序要生成的内容。

        <a href="<?=Route::url('named_url', array('first' => 'my', 'last' => 'whacky'))?>">
            http://dev.example.com/index.php/my:whacky:url
        </a>
        

        路线优点:

        1. 绝对网址的所有优点。
        2. 使用网址中的任何字符。
        3. 更多控制(适合SEO)。
        4. 能够以算法方式生成URL。这允许URL可配置。更改URL是单个文件中的单个更改。
        5. 不需要404未找到。后备路线可以显示站点地图或错误页面。
        6. 间接访问应用程序文件的便捷安全性。警卫声明可以确保每个人都通过适当的渠道到达。
        7. MVC方法的实用性。

        8. 我的选择

          大多数人会以某种方式在他们的项目中使用所有三种形式。关键是要了解它们并选择最适合该任务的那个。

答案 5 :(得分:6)

如果要在您的网站中使用,最好使用相对URL,如果您需要将网站移动到其他域名或只是本地调试,则可以这样做。

看一下stackoverflow正在做什么(在firefox中使用ctrl + U):

<a href="/users/recent/90691"> // Link to an internal element

在某些情况下,他们使用绝对网址:

<link rel="stylesheet" href="http://sstatic.net/so/all.css?v=5934">

...但这只是提高速度的最佳做法。在你的情况下,它看起来不像你做的那样,所以我不担心它。

答案 6 :(得分:6)

我不得不在这里与大多数人不同意。

我认为,当您想要快速启动并运行并且不要在盒子外思考时,相对URL方案“很好”,特别是如果您的项目很少,开发人员很少(或者只是您自己)。

然而,一旦你开始在大型,脂肪系统上工作,你一直在切换域和协议,我相信更优雅的方法是有序的。

从本质上比较绝对和相对URL时,绝对胜出。为什么?因为它永远不会破裂。永远。绝对URL正是它所说的。问题在于您必须保留绝对URL。

绝对URL链接的弱方法实际上是对整个URL进行硬编码。这不是一个好主意,也可能是为什么人们认为它们是危险/邪恶/烦人维持的罪魁祸首。更好的方法是为自己编写一个易于使用的URL生成器。它们易于编写,并且可以令人难以置信地强大 - 自动检测您的协议,易于配置(字面上为整个应用程序设置一次网址)等,它会自动注入您的域名。关于这一点的好处:您继续使用相对URL进行编码,并且在运行时,应用程序会立即将您的URL作为完整绝对值插入。真棒。

看到所有现代网站几乎都使用某种动态后端,这样做符合网站的最佳利益。绝对URL不仅可以让您确定他们指向的位置,还可以提高SEO性能。

我可能会补充说,绝对URL以某种方式改变页面加载时间的论点是一个神话。如果您的域重量超过几个字节并且您在20世纪80年代使用的是拨号调制解调器,那么肯定。但事实并非如此。 https://stackoverflow.com/是25个字节,而他们用于站点导航区域的“topbar-sprite.png”文件的重量为9+ kb。这意味着与精灵文件相比,额外的URL数据是加载数据的.2%,并且该文件甚至不被视为性能损失。

这个大而未经优化的整页背景图片更有可能减慢加载时间。

有关为何不应使用相对网址的有趣帖子如下: http://yoast.com/relative-urls-issues/

例如,亲戚可能会遇到的一个问题是,有时服务器映射(请注意大型,混乱的项目)不与文件名对齐,开发人员可能会假设相关的URL只是不是真的。我今天刚看到我正在进行的一个项目,它带来了整整一页。

或许开发人员忘记切换指针,突然谷歌将整个测试环境编入索引。哎呀 - 重复内容(对SEO不好!)。

绝对可能是危险的,但如果使用得当且无法破坏你的构建,它们被证明更可靠。看看上面的文章,它给出了为什么Wordpress url生成器非常棒的原因。

:)

答案 7 :(得分:5)

在大多数情况下,相对URL是可行的方式,它们本质上是可移植的,这意味着如果您想要提升您的网站并将其放在其他地方,它可以立即工作,减少可能数小时的调试。

有一个相当不错的article on absolute vs relative URLs,请查看。

答案 8 :(得分:4)

以URL方案和方案特定部分(http://https://ftp://等)开头的网址是绝对网址。

任何其他URL都是相对URL,并且需要一个基本URL,相对URL是从中解析的(因而依赖于),如果没有另外声明,则使用引用的资源的URL。

请查看RFC 2396 – Appendix C以获取解析相对网址的示例。

答案 9 :(得分:3)

假设您有一个网站www.yourserver.com。在Web文档的根目录中,您有一个图像子指南,并且您有myimage.jpg。

绝对URL定义文档的确切位置,例如:

http://www.yourserver.com/images/myimage.jpg

相对URL定义相对于当前目录的位置,例如,假设您位于图像所在的根网站目录中:

images/myimage.jpg

(相对于该根目录)

您应该尽可能使用相对URL。如果您将网站移至www.anotherserver.com,则必须更新指向www.yourserver.com的所有绝对URL,相关的网址将保持原样。

答案 10 :(得分:0)

对于每个支持相对URI解析的系统,相对URI和绝对URI都可以实现相同的目标:引用。它们可以互换使用。因此,您可以在每个案例中做出不同的决定。从技术上讲,它们提供了相同的引用。

准确地说,每个相对URI都有一个绝对URI。这就是解析相对URI的基URI。因此,相对URI实际上是绝对URI之上的一个特征。

这就是为什么对于相对URI,你可以单独使用绝对URI more - 这对于静态网站尤其重要,否则与绝对URI相比,静态网站的维护难度不大

相对URI解析的这些积极影响也可以用于动态Web应用程序开发。在动态环境中,引入的不灵活绝对URI也更容易应对,因此对于一些不确定URI解析以及如何正确实现和管理它的开发人员(并不总是那么容易),通常选择使用绝对值在网站的动态部分中的URI,因为它们可以引入其他动态功能(例如,包含URI前缀的配置变量),以便解决不灵活性。

那么使用绝对URI有什么好处呢?从技术上讲,没有,但我会说:相对URI更复杂,因为它们需要针对所谓的绝对基URI进行解析。即使分辨率严格定义多年,您也可能会遇到URI解析错误的客户端。由于绝对URI不需要任何解析,因此使用绝对URI不会因相对URI解析而遇到错误的客户端行为。那么实际风险有多高?嗯,这是非常罕见的。我只知道一个互联网浏览器有相对URI解析的问题。这不是一般情况,只是在一个非常(模糊)的情况下。

在HTTP客户端(浏览器)旁边,对于超文本文档或代码的作者来说,它可能更复杂。这里绝对URI的优点是更容易测试,因为您只需将其按原样输入浏览器地址栏即可。但是,如果不仅仅是你的一小时工作,那么实际理解绝对和相对URI处理通常会让你更有利,这样你才能真正利用相对链接的好处。

答案 11 :(得分:-5)

我衷心地建议将相同网址的相对网址指向同一网站的其他位。

不要忘记,对HTTPS的更改 - 即使在同一网站中 - 也需要一个绝对的URL。