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



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

让我们从头开始。我正在用PHP开发一个自定义内容管理系统。我正在使用mod_rewrite将所有请求(如http://domain.com/path/artist/edit/25)重定向到http://domain.com/path/index.php?url=/artist/edit/25。因此,http://domain.com/path/后面的URL部分实际上是虚拟的。

我希望所有链接都采用<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>
    ...

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

这就是为什么我需要你澄清:

  1. <base href=...>指向目录而不是当前文档 URL 是否是一种普遍接受的做法?
  2. 这种做法是否符合使用 HTML <base> 元素的要求?
  3. 它会以任何方式影响像Googlebot这样的爬虫吗?它们是否需要<base href=...>匹配每个特定的文档 URL?

我还想知道当URL的某些部分是虚拟的时,您如何解决相对链接和资源引用的问题。我发现像WordPress这样的项目倾向于完全避免相对链接,而走"绝对链接方式"。

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

主要爬网程序支持绝对和相对 URL 以及 base 元素。一些摇晃和烘焙爬虫不理解相对 URL 和/或不支持 base 元素(因此导致服务器日志中出现多个 404 行,尽管这是一件小事)。

我建议不要使用 base 元素。相对链接往往容易出错,导致错误解析的 URL,同时不提供任何重大好处。通常,始终使用绝对 URL 更合理、更容易。

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

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

它会以任何方式影响像Googlebot这样的爬虫吗?他们是否需要匹配每个特定的文档 URL?

很难正确获得基本标签,并且有一些方法可以使用对googlebot等透明的更好方法做您想做的事情。

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

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

恕我直言,这不是适合您情况的最佳解决方案。

在 url "http://example.com/path/index.php?url=/artist/edit/25" 中,您希望在路径中转换部分查询( 基 example.com/path/index.php ?url= )...这可能是一个大问题。您将如何处理同时具有查询的查询?(例如,接收搜索词或表单 GET)

Apache mod_rewrite会是一个更好的选择,正如Harry的回答所建议的那样(或nginx重写规则)。有了它,您可以轻松地"转换"请求,例如 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 中的最后一个示例,它非常接近满足您的所有重写需求 (您只需要确保正确处理查询的其余部分)

获取表单的 URL 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

相关内容

最新更新