是否有普遍接受的方法可以使对图像,脚本,样式表的所有链接和引用相对于某个路径,而不管当前文档的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
)。它破坏了整个概念。
这就是为什么我需要你澄清:
- 让
<base href=...>
指向目录而不是当前文档 URL 是否是一种普遍接受的做法? - 这种做法是否符合使用 HTML
<base>
元素的要求? - 它会以任何方式影响像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