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

另外,用哪个比较好呢?


当前回答

我不同意大多数人的观点。

我认为相对URL方案是“好的”,当你想快速启动和运行一些东西,而不是跳出框框思考,特别是如果你的项目很小,只有几个开发人员(或者只有你自己)。

然而,一旦您开始在大型的、臃肿的系统上工作,并且一直在切换域和协议,我相信一种更优雅的方法是合适的。

当你从本质上比较绝对和相对url时,绝对url胜出。为什么?因为它永远不会坏。永远。绝对URL就是它所描述的那样。问题是你必须维护你的绝对url。

The weak approach to absolute URL linking is actually hard coding the entire URL. Not a great idea, and probably the culprit of why people see them as dangerous/evil/annoying to maintain. A better approach is to write yourself an easy to use URL generator. These are easy to write, and can be incredibly powerful- automatically detecting your protocol, easy to config (literally set the url once for the whole app), etc, and it injects your domain all by itself. The nice thing about that: You go on coding using relative URLs, and at run time the application inserts your URLs as full absolutes on the fly. Awesome.

鉴于所有现代网站实际上都使用某种动态后端,这样做对网站最有利。绝对url的作用不仅仅是让你确定它们指向哪里——它们还可以提高SEO性能。

I might add that the argument that absolute URLs is somehow going to change the load time of the page is a myth. If your domain weighs more than a few bytes and you're on a dialup modem in the 1980s, sure. But that's just not the case anymore. https://stackoverflow.com/ is 25 bytes, whereas the "topbar-sprite.png" file that they use for the nav area of the site weighs in at 9+ kb. That means that the additional URL data is .2% of the loaded data in comparison to the sprite file, and that file is not even considered a big performance hit.

大的,未优化的,整个页面的背景图像更有可能减慢你的加载时间。

这里有一篇关于为什么不应该使用相对url的有趣文章: 为什么相对url应该被禁止

例如,可能会出现的一个问题是,有时服务器映射(请注意大型、混乱的项目)与文件名不一致,开发人员可能会对相对URL做出不正确的假设。我今天在我参与的一个项目上看到了这个,它把整个页面都拖下来了。

或者开发人员忘记切换指针,突然谷歌索引了整个测试环境。唉,重复的内容(不利于搜索引擎优化!)

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

:)

其他回答

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

有一篇相当不错的文章是关于绝对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">

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

实际上有三种类型需要明确讨论。在实践中,虽然URL已经被抽象为在较低的级别上处理,但我想说的是,开发人员可以一辈子都不用手写一个URL。

绝对

绝对url将代码绑定到协议和域。这可以通过动态url解决。

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

绝对的优点:

Control - The subdomain and protocol can be controlled. People that enter through an obscure subdomain will be funneled into the proper subdomain. You can hop back and forth between secure and non-secure as appropriate. Configurable - Developers love things to be absolute. You can design neat algorithms when using absolute URLs. URLs can be made configurable so that a URL can be updated site-wide with a single change in a single configuration file. Clairvoyance - You can search for the people scraping your site or maybe pick up some extra external links.


根相对

根相对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” />

相对的缺点:

CONFUSING - How many dots is that? how many folders is that? Where is the file? Why isn't it working? MAINTENANCE - If a file is accidentally moved resources quit loading, links send the user to the wrong pages, form data might be sent to the incorrect page. If a file NEEDS to be moved all the resources that are going to quit loading and all the links that are going to be incorrect need to be updated. DOES NOT SCALE - When webpages become more complex and views start getting reused across multiple pages the relative links will be relative to the file that they were included into. If you have a navigation snippet of HTML that is going to be on every page then relative will be relative to a lot of different places. The first thing people realize when they start creating a template is that they need a way to manage the URLs. COMPUTED - They are implemented by your browser (hopefully according to RFC). See chapter 5 in RFC3986. OOPS! - Errors or typos can result in spider traps.


路线的演变

开发人员已经停止编写这里所讨论的url。所有的请求都是针对一个网站的索引文件,并包含一个查询字符串,也就是路由。路由可以看作是一个迷你URL,它告诉应用程序要生成的内容。

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

路线的优点:

绝对url的所有优点。 URL中任意字符的使用。 更多的控制(有利于搜索引擎优化)。 能够算法生成url。这允许url是可配置的。更改URL是对单个文件的单个更改。 不需要404 not found。回退路由可以显示站点地图或错误页面。 方便安全的间接访问应用程序文件。警卫声明可以确保每个人都是通过适当的渠道到达的。 MVC方法的实用性。


我的看法

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

我衷心推荐使用相对url将同一站点的部分指向同一站点的其他部分。

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

请看这个: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包括“路径”部分之前的部分——换句话说,它包括方案(http://foo/bar/baz中的http)和主机名(http://foo/bar/baz中的foo)(还有可选的port、userinfo和port)。

相对url以路径开头。

绝对URL是绝对的:资源的位置可以仅通过URL本身来解析。相对URL在某种意义上是不完整的:要解析它,您需要方案和主机名,而这些通常来自当前上下文。例如,在网页中

http://myhost/mypath/myresource1.html

你可以这样放一个链接

<a href="pages/page1">click me</a>

在链接的href属性中,使用了一个相对url,如果单击了它,则必须解析它以便跟随它。在本例中,当前上下文为

http://myhost/mypath/myresource1.html

因此,这些文件的模式、主机名和引导路径将被添加到pages/page1中,从而得到

http://myhost/mypath/pages/page1

如果链接是:

<a href="/pages/page1">click me</a>

(注意/出现在URL的开头),那么它将被解析为

http://myhost/pages/page1

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

在一个web应用程序中,我建议对属于你的应用程序的所有资源使用相对url。这样,如果你改变了页面的位置,一切都将继续工作。任何外部资源(可以是完全在应用程序之外的页面,也可以是通过内容交付网络交付的静态内容)应该始终使用绝对url指向:如果不这样做,则根本无法定位它们,因为它们驻留在不同的服务器上。