拥有相对于路径的链接(即http:// domain / path /)

时间:2016-04-24 01:33:02

标签: html location-href

是否有普遍接受的方法可以将图像,脚本,样式表的所有链接和引用都相对于某个路径而不管当前文档的URL?

让我们从一开始就开始吧。我正在用PHP开发自定义内容管理系统。我正在使用mod_rewritehttp://domain.com/path/artist/edit/25之类的所有请求重定向到http://domain.com/path/index.php?url=/artist/edit/25。因此,http://domain.com/path/之后的网址部分实际上是虚拟的。

我希望所有链接都采用<a href="artist/show">...</a>格式,并以<link href="ui/css/style.css"...>等格式引用图像,脚本等。

嗯,似乎有可能:

    ...
    <base href="http://domain.com/path/" />
    ...

这样我就可以通过以下方式链接到脚本和样式表:

    ...
    <!-- Custom page style CSS -->
    <link href="ui/css/style.css" rel="stylesheet" type='text/css'>
    <!-- Support for CSS3 media query in IE8 -->
    <script type="text/javascript" src="ui/js/respond.js"></script>
    <!-- MooTools 1.6.0 -->
    <script type="text/javascript" src="ui/js/MooTools-Core-1.6.0.js"></script>
    ...

但是,<base href=...>的AFAIK应与当前页面请求(http://domain.com/path/artist/edit/25)匹配。它破坏了整个概念。

这就是我需要你澄清的原因:

  1. <base href=...>指向目录而不指向当前文档网址是否是一种普遍接受的做法?
  2. 这种做法是否符合HTML <base>元素的使用要求?
  3. 它会以任何方式影响Googlebot等抓取工具吗?他们是否要求<base href=...>匹配每个特定的文档网址?
  4. 我还想知道当URL的某些部分是虚拟的时,如何解决相对链接和资源引用的问题。我发现像WordPress这样的项目倾向于完全避免相对链接并采用绝对链接的方式&#34;。

3 个答案:

答案 0 :(得分:1)

base元素的要点是指定用于解析相对链接而不是当前文档URL的任意基本URL。否则该元素没有意义,因为默认情况下,当前文档URL默认用作基本URL。

主要抓取工具同时支持绝对和相对网址以及base元素。一些摇动和烘焙爬虫不理解相对URL和/或不支持base元素(因此在您的服务器日志中导致多个404行,尽管这是次要的)。

我建议使用base元素。相对链接往往是容易出错导致错误解析的网址,同时没有提供任何严重的好处。通常使用绝对URL通常更合理,更容易。

答案 1 :(得分:1)

  

指向是否是一种普遍接受的做法   目录而不是当前文档URL?

不,这不常见。事实上,我说它非常罕见,因为有更好的方法可以在没有它的情况下创建网站的逻辑信息架构。

  

它会以任何方式影响Googlebot等抓取工具吗?他们是否要求匹配每个特定的文档URL?

很难让基本标记正确,并且有很多方法可以使用对googlebot等透明的更好方法来做你想要的事情。

请注意,绝对链接是您在源代码中看到的,但这并不意味着链接物理映射到目录和文件等。使用像apache上的mod_rewrite这样的工具,您可以像您几乎可以使用任何物理文件系统,这也是我推荐的,因为随着事情的变化,您不再依赖于特定的解决方案。这也是大多数php应用程序通过index.php脚本发送所有内容的原因,然后应用程序控制信息架构,而不是文件系统。

答案 2 :(得分:1)

&#34; base href&#34;可以毫无问题地使用,但它并不总是最好的解决方案。如果您的服务器将回答具有不同服务器名称和路径的请求(例如&#34; http://www.example.com/companysection/especificservice&#34;和&#34; http://service.internalnetwork.dev/&#34;)

恕我直言,这不是你案件的最佳解决方案。

在网址&#34; http://example.com/path/index.php?url=/artist/edit/25&#34;你想在一个路径中转换部分查询(基于example example.com/path/index.php ?url = )......这可能是个大问题。您如何处理也有查询的查询? (例如,接收搜索词或表格GET)

Apache mod_rewrite是一个更好的选择,正如Harry回答建议(或nginx重写规则)。有了它,你可以轻松地转变&#34; http://example.com/path/artist/edit/25?search=something&order=ASC中的http://example.com/path/index.php?url=artist/edit/25&search=something&order=ASC之类的请求 从长远来看,这样可以减少问题。

查看https://wiki.apache.org/httpd/RewriteQueryString中的最后一个示例,它非常接近满足您的所有重写需求  (您只需确保正确处理剩余的查询)

  

获取http://example.com/path/var/val形式的网址并进行转换   它进入var = val查询http://example.com/path?var=val。实质上   与上述配方相反。此示例适用于任何有效的   三级网址。 http://example.com/path/var/val将被转变   进入http://example.com/path?var=val

     

RewriteRule ^ / path /([^ /] +)/([^ /] +)/ path?$ 1 = $ 2