是否有普遍接受的方法可以将图像,脚本,样式表的所有链接和引用都相对于某个路径而不管当前文档的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/
之后的网址部分实际上是虚拟的。
我希望所有链接都采用<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
)匹配。它破坏了整个概念。
这就是我需要你澄清的原因:
<base href=...>
指向目录而不指向当前文档网址是否是一种普遍接受的做法?<base>
元素的使用要求?<base href=...>
匹配每个特定的文档网址?我还想知道当URL的某些部分是虚拟的时,如何解决相对链接和资源引用的问题。我发现像WordPress这样的项目倾向于完全避免相对链接并采用绝对链接的方式&#34;。
答案 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