此外,哪一种更好使用?
如果你说的绝对URL是指包含协议(例如HTTP / HTTPS)和主机名(例如yourdomain.example
)的URL,那么永远不要这样做(对于本地资源),因为这样会很难维护和调试。
假设你在代码中到处都使用了绝对URL,比如<img src="http://yourdomain.example/images/example.png">
。现在当你要进行以下操作时会发生什么:
test.yourdomain.example
-> 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
。
http://yourdomain.example/images/example.png
//yourdomain.example/images/example.png
这个URL是基于当前使用的方案相对的,几乎总是在包含外部资源(图片、JavaScript文件等)时使用。
这种类型的URL使用所在页面的当前方案。这意味着你在页面 http://yourdomain.example
上,并且在该页面上有一个图像标签 <img src="//yourdomain.example/images/example.png">
,图像的URL将解析为 http://yourdomain.example/images/example.png
。
当你在页面 https://yourdomain.example 上,并且在该页面上有一个图像标签 <img src="//yourdomain.example/images/example.png">
,图像的URL将解析为 https://yourdomain.example/images/example.png
。
这样可以避免在不需要时通过HTTPS加载资源,并在需要时自动确保资源通过HTTPS请求。
上述URL在服务器端与前一个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
<!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>
一般来说,最好使用相对URL以便您的网站不会受到其当前部署位置的基本URL的限制。例如,它将能够在localhost上正常工作,并且无需修改即可在您的公共域上使用。
/
开头的绝对URL,这样可以轻松地将应用程序移动到另一台服务器上,但是当我将我的应用程序部署在www.mydomain.com/apps/
时,我无法找到任何资源。因此,我同意相对URL更安全-尽管当您在不同路由中重用服务器端模板时,它们可能会出现问题,但在渲染之前,您可以轻松使用header-redirects将用户发送到正确的路径。 - Tarionfoo://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://foo/bar/baz
中的http
)和主机名(在http://foo/bar/baz
中的foo
)(以及可选的端口、用户信息和端口)。http://myhost/mypath/myresource1.html
<a href="pages/page1">click me</a>
http://myhost/mypath/myresource1.html
pages/page1
之前,得到的结果是http://myhost/mypath/pages/page1
<a href="/pages/page1">click me</a>
/
)那么它将被解析为http://myhost/pages/page1
/
表示主机的根。//example.com/…
、?foobar
和#foobar
也是相对URL,不以URL路径开头(好吧,对于?foobar
,您可以说它以一个空路径开头)。 - Gumbo//example.com/…
这种类型的URL被称为相对路径吗?这对我来说很新奇。 - törzsmókus假设我们正在创建一个子站点,其文件位于文件夹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时,你应该总是指相对于什么。
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>标签不会影响绝对链接。我们会将主页作为基础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看起来像是相对路径,实际上它们是绝对路径。
特别注意锚点。要在当前页面内导航,我们必须写href="t-shirts/t-shirt-life-is-good/#comments"而不是href="#comments"。后者将会跳转到主页。
对于内部链接,我使用基于基础路径的相对URL(5)。对于外部链接和新闻通讯,我使用绝对URL(1)。
实际上,有三种类型应该明确讨论。但在实践中,URL已经被抽象为在较低级别处理,我甚至可以说开发人员可能在他们的整个生涯中都不需要手动编写一个URL。
绝对链接将您的代码与协议和域名捆绑在一起。动态URL可以解决此问题。
<a href=“https://dev.example.com/a.html?q=”>https://dev.example.com/a.html?q=</a>
绝对链接优点:
可控性 - 子域名和协议都可以被控制。访问一个不常用的子域名的人会被引导到正确的子域名。你可以根据需要在安全和非安全之间切换。
可配置性 - 开发人员喜欢一切都是确定的。使用绝对链接可以设计出漂亮的算法。URL可以被配置,这样只需要在单个配置文件中进行一次更改就可以在整个站点范围内更新URL。
洞察力 - 你可以搜索正在抓取你网站内容的人或者获取一些额外的外部链接。
根相对路径将你的代码与基础URL绑定在一起。这可以通过动态URL和/或base标签来克服。
<a href=“/index.php?q=”>.example.com/index.php?q=</a>
根路径优点:
相对路径将您的代码与目录结构绑定在一起。无法克服这一点。相对路径仅在文件系统中用于遍历目录或作为琐碎任务的快捷方式。
<a href=“index.php?q=”>index.php?q=</a>
<link src=“../.././../css/default.css” />
相对路径的缺点:
容易混淆 - 这是几个点?这是多少个文件夹?文件在哪里?为什么它不起作用了?
维护困难 - 如果一个文件被意外移动,资源将停止加载,链接会发送用户到错误的页面,表单数据可能会被发送到错误的页面。如果必须要移动一个文件,则需要更新所有将停止加载的资源和所有将变得不正确的链接。
无法扩展 - 当网页变得更加复杂,并且视图开始在多个页面之间重复使用时,相对链接将与它们所包含的文件相关。如果您有一个在每个页面上都会出现的导航HTML片段,那么相对路径将与许多不同的位置相关联。当人们开始创建模板时,他们首先意识到的是他们需要一种管理URL的方法。
计算复杂 - 它们由您的浏览器实现(希望根据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>
路由器优势:
大多数人在项目中以某种方式使用所有三种形式。关键是要理解它们,选择最适合任务的形式。
/products/wallets/thing.html
与thing.html
相比,又与http://www.myshop.com/products/wallets/thing.html
相比。 - Bradley Floodecho Route::url('route_name')
来构建绝对URL,使用站点URL和路由信息,并选择通过HTTPS进行访问。 - None<a href="/users/recent/90691"> // Link to an internal element
<link rel="stylesheet" href="http://sstatic.net/so/all.css?v=5934">
在大多数情况下,相对URL是更好的选择,它们具有可移植性,这意味着如果您想将您的网站移到其他地方,它会立即工作,从而减少可能长达数小时的调试时间。
关于绝对URL和相对URL,这里有一篇相当不错的文章,可以看看。
以URL方案和特定于方案的部分(http://
,https://
,ftp://
等)开头的URL是绝对URL。
任何其他URL都是相对URL,并且需要一个基本URL来解析相对URL(因此依赖于)该引用所使用的资源的URL,如果没有声明,则为该引用所使用的资源的URL。
请参阅RFC 2396 - 附录C,了解解析相对URL的示例。
假设你有一个网站www.yourserver.example
。在网页文件的根目录下,你有一个名为images的子目录,在其中又有一个名为myimage.jpg的文件。
绝对URL定义了文档的确切位置,例如:
http://www.yourserver.example/images/myimage.jpg
相对URL是相对于当前目录的位置定义,例如,假设您在根网络目录中,您的图像位于:
images/myimage.jpg
(相对于根目录)
在可能的情况下,您应该始终使用相对URL。如果您将站点移动到www.anotherserver.com,则必须更新所有指向www.yourserver.example
的绝对URL,而相对URL将保持不变。