我想知道这两种类型的URL之间的区别:相对URL(用于图片,CSS文件,JS文件等)和绝对URL。
另外,哪一个更好用?
答案 0 :(得分:194)
如果绝对URL是指包括方案(例如http / https)和主机名(例如yourdomain.com)的URL,则不会这样做(对于本地资源),因为维护和调试会很糟糕。
假设您在代码中的所有地方都使用了绝对网址,例如<img src="http://yourdomain.com/images/example.png">
。现在,当你要去的时候会发生什么:
在第一个示例中,您将收到有关在页面上请求的不安全内容的警告。因为您的所有网址都是硬编码的,所以使用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
在下面的示例中,我假设网站是从服务器/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。
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更可取,因为链接可以在站点的任何页面上不加改变地使用。
我们考虑过两种极端情况:&#34;绝对&#34;绝对的&#34;绝对&#34;相对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/"
Google建议使用此类网址。但是,现在通常认为http://和https://是不同的站点。
即。相对于域的根文件夹。
Link to home page
href="/shop/"
Link to product page
href="/shop/t-shirts/t-shirt-life-is-good/"
如果所有页面都在同一个域中,那么这是一个不错的选择。当您将网站移动到其他域时,您不必在网址中大量替换域名。
标签&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>
绝对优点:
控制 - 可以控制子域和协议。通过一个不起眼的子域进入的人将被汇入正确的子域。您可以根据需要在安全和非安全之间来回跳转。
可配置 - 开发人员喜欢绝对的东西。使用绝对URL时,您可以设计整洁的算法。 URL可以进行配置,以便只需在单个配置文件中进行一次更改即可在站点范围内更新URL。
千里眼 - 您可以搜索抓取您网站的人或者选择一些额外的外部链接。
根相对网址将您的代码绑定到基本网址。这可以通过动态网址和/或base tags来解决。
<a href=“/index.php?q=”>.example.com/index.php?q=</a>
Root Relative Pros:
相对URL将您的代码绑定到目录结构。没有办法克服这一点。相对URL仅在文件系统中用于遍历目录或作为琐事任务的快捷方式。
<a href=“index.php?q=”>index.php?q=</a>
<link src=“../.././../css/default.css” />
相对缺点:
ConfUSING - 这是多少个点?这是多少个文件夹?文件在哪里?为什么它不起作用?
MAINTENANCE - 如果文件被意外移动,资源退出加载,链接会将用户发送到错误的页面,表单数据可能会被发送到错误的页面。如果要移动文件NEEDS,则需要更新所有要退出加载的资源以及所有不正确的链接。
无法扩展 - 当网页变得更加复杂并且视图开始在多个页面中重复使用时,相对链接将相对于它们所包含的文件。如果你有一个HTML的导航片段将在每个页面上,那么亲戚将相对于许多不同的地方。人们开始创建模板时首先意识到他们需要一种方法来管理URL。
COMPUTED - 它们由您的浏览器实现(希望根据RFC)。请参阅RFC3986中的第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>
路线优点:
大多数人会以某种方式在他们的项目中使用所有三种形式。关键是要了解它们并选择最适合该任务的那个。
答案 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。