绝对vs相对URL

Hai*_*vgi 195 html url

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

另外,哪一个更好用?

Pee*_*Haa 212

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

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

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

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

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

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

因此,要回答有关是使用绝对URL还是相对URL的问题:始终使用相对URL(对于本地资源).

不同的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

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

//yourdomain.com/images/example.png

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

这种类型的URL的作用是使用它所在页面的当前方案.这意味着您在页面http://yourdomain.com上并且该页面上是图像<img src="//yourdomain.com/images/example.png">的URL将解析的图像标记http://yourdomain.com/images/example.png.
当您进入页面http**s**://yourdomain.com并且该页面上是图像标记时<img src="//yourdomain.com/images/example.png">,图像的URL将被解析https://yourdomain.com/images/example.png.

这防止加载资源通过HTTPS是不需要的时候,并自动确保被请求的资源通过HTTPS时,它必要的.

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

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

/images/example.png

对于本地资源,这是引用它们的首选方式.这是基于/var/www/mywebsite您网站的文档root()的相对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>
Run Code Online (Sandbox Code Playgroud)

一些(有点)重复

  • 这个答案假设没有动态生成绝对URL,这解决了上面提到的每个问题. (8认同)
  • 将Google Jquery包含为无协议的示例:<script src ="// ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"> </ script> (3认同)
  • 与使用相对 URL 相比,使用绝对 URL 加载页面是否更快?(花时间解决相对路径?) (2认同)
  • 任何可能的差异都是如此之小,如果可以衡量的话,你不应该担心它. (2认同)
  • J.Money是对的.现代Web框架具有"反向路由"的概念,允许您从一个页面创建URL到另一个页面(它必须是同一网站中的另一个页面).这些允许您为URL指定名称,然后使用此名称而不是URL.这样,如果您想要更改URL,您可以在一个地方更改URL,因为在其他任何地方您只能通过其名称引用该URL. (2认同)

Dan*_*llo 177

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

  • 出于维护目的,可以更容易地使用绝对URL,而不使用域名.即在StackOverflow上使用绝对URL'/ questions/2005079/absolute-vs-relative-urls'链接到这个问题.前面的'/'使URL绝对.当您移动文件或更改项目的目录结构时,此方法可以获得回报. (60认同)
  • @Mike你为什么要打电话给[root-relative](http://www.motive.co.nz/glossary/linking.php?ref#root)网址'绝对'? (26认同)
  • @Baumr但你能做到吗?我绝对是使用该方法的粉丝/支持者,但进入一个更大的框架和大型重构是一个众所周知的令人生畏/可怕的任务.虽然您认为可能已将它们全部切换,即使在智能IDE中,如果将它们编码为字符串或动态创建,通常也会错过它们.最糟糕的部分是,通常那些错过的引用在您的解决方案重新投入生产之后才会被捕获...... :( (10认同)
  • +1我同意.可能有(几次)绝对网址更好,例如使用CDN时,或者如果您需要更改内容网站.搜索域名比搜索相对URL更容易恕我直言. (5认同)
  • @törzsmókus好问题.它不允许我编辑和那是几年前,甚至在我遇到术语根相对之前. (4认同)
  • 我遇到过我使用以`/`开头的绝对URL的情况,因此应该可以移动到另一台服务器,但是后来我在`www.mydomain.com/apps/`中部署了我的应用程序,现在我找不到任何资源. 这就是为什么我同意相对 URL 更安全的原因 - 当您在不同的路由中重用服务器端模板时,它们仍然会混乱,但是在那里您可以轻松地使用标头重定向在呈现之前将用户发送到正确的路径。 (2认同)
  • URL 甚至可以是相对的吗?协议的存在难道不是构成 URI 和 URL 的原因吗? (2认同)
  • 关于术语的一个古老但具有启发性的答案:/sf/answers/63284651/(_relative path、absolute path、relative URL、absolute URL_) (2认同)

Rol*_*man 62

请参阅: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
Run Code Online (Sandbox Code Playgroud)

绝对URL包括部件的"路径"部分之前-换句话说,它包括计划(httphttp://foo/bar/baz)和主机名(所述foohttp://foo/bar/baz)(和任选的端口,用户信息和端口).

相对网址以路径开头.

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

http://myhost/mypath/myresource1.html
Run Code Online (Sandbox Code Playgroud)

你可以把这样的链接

<a href="pages/page1">click me</a>
Run Code Online (Sandbox Code Playgroud)

href链接的属性中,使用了相对URL,如果单击它,则必须解析它才能跟随它.在这种情况下,当前的上下文是

http://myhost/mypath/myresource1.html
Run Code Online (Sandbox Code Playgroud)

所以这些的模式,主机名和前导路径都被采用并预先放置pages/page1,屈服

http://myhost/mypath/pages/page1
Run Code Online (Sandbox Code Playgroud)

如果链接是:

<a href="/pages/page1">click me</a>
Run Code Online (Sandbox Code Playgroud)

(注意/出现在网址的开头)然后它会被解决为

http://myhost/pages/page1
Run Code Online (Sandbox Code Playgroud)

因为前导/表示主机的根目录.

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

  • 相对URL*不*需要从URL路径开始.`// example.com/...`,`?foobar`和`#foobar`也是相对的URL而不是以URL路径开头(好吧,对于`?foobar`,你可以说它确实以*空开头*路径). (9认同)
  • @törzsmókus在[RFC 2396]中(http://tools.ietf.org/html/rfc2396#section-3.1):"相对URI引用与绝对URI的区别在于它们不以方案名称开头." (2认同)

Vla*_*nov 41

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

1.绝对URL

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/"
Run Code Online (Sandbox Code Playgroud)

2.相对URL

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

Link from product page to home page
href="../../"
Run Code Online (Sandbox Code Playgroud)

虽然相对URL看起来比绝对URL短,但绝对URL更可取,因为链接可以在站点的任何页面上不加改变地使用.

中级案件

我们考虑了两种极端情况:"绝对"绝对和"绝对"相对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/"
Run Code Online (Sandbox Code Playgroud)

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

4.根相对URL

即相对于域的根文件夹.

Link to home page
href="/shop/"

Link to product page
href="/shop/t-shirts/t-shirt-life-is-good/"
Run Code Online (Sandbox Code Playgroud)

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

5.基本相对URL(主页相对)

标签<base>指定基本URL,它会自动添加到所有相关链接和锚点.基本标记不会影响绝对链接.作为基本URL,我们将指定主页:<base href ="http://sites.ru/shop/">.

Link to home page
href=""

Link to product page
href="t-shirts/t-shirt-life-is-good/"
Run Code Online (Sandbox Code Playgroud)

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

结论

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


J.M*_*ney 24

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

绝对

绝对URL将您的代码与协议和域绑定在一起.这可以通过动态URL来克服.

<a href=“https://dev.example.com/a.html?q=”>https://dev.example.com/a.html?q=</a>
Run Code Online (Sandbox Code Playgroud)

绝对优点:

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

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

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


根相对

根相对URL将您的代码绑定到基本URL.这可以通过动态URL和/或基本标记来克服.

<a href=“/index.php?q=”>.example.com/index.php?q=</a>
Run Code Online (Sandbox Code Playgroud)

根相对优点:

  1. 可配置 - 基本标签使它们相对于您选择的任何根,使交换域和实现模板变得容易.

相对的

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

<a href=“index.php?q=”>index.php?q=</a>
<link src=“../.././../css/default.css” />
Run Code Online (Sandbox Code Playgroud)

相对缺点:

  1. 混淆 - 那是多少点?这是多少个文件夹?文件在哪里?为什么不工作?

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

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

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

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


路线的演变

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

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

路线优点:

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

我的看法

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

  • @Lovethenakedgun 如果人们复制代码,甚至将他们的域名指向您服务器的 IP,相对 URL 将使用户停留在虚假网站上,而绝对 URL 将引导用户返回真实网站。绝对 URL 是对来源的归属。搜索引擎可用于查找粗心的抓取者或欺诈者,他们窃取内容或复制整个网站(例如用于网络钓鱼)。 (2认同)

mar*_*cgg 6

如果它是在您的网站中使用,最好使用相对URL,如果您需要将网站移动到另一个域名或只是本地调试,您可以.

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

<a href="/users/recent/90691"> // Link to an internal element
Run Code Online (Sandbox Code Playgroud)

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

<link rel="stylesheet" href="http://sstatic.net/so/all.css?v=5934">
Run Code Online (Sandbox Code Playgroud)

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


dud*_*wad 6

我不得不在这里不同意多数人的意见.

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

但是,一旦你开始处理大型,脂肪系统,你一直在切换域和协议,我相信一个更优雅的方法是有序的.

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

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

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

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

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

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

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

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

绝对可能是危险的,但如果使用得当并且不能破坏你的构造,它们被证明更可靠.看看上面的文章,它给出了为什么Wordpress url生成器超级棒的原因.

:)