8

我正在开发一个使用 url 路由的 PHP 网站。我希望该站点独立于目录,以便可以将其从http://site.example.com/移动到http://example.com/site/而无需更改 HTML 中的每个路径。当我链接到不受路由影响的文件时,问题就出现了,比如 css 文件、图像等。

例如,假设index控制器动作的视图welcome包含图像img/banner.jpg。如果使用 url http://site.example.com/welcome请求页面,浏览器将请求图像为http://site.example.com/img/banner.jpg,这很好。但是,如果页面是通过 url http://site.example.com/welcome/index请求的,浏览器会认为这welcome是一个目录,并会尝试以http://site.example.com/welcome获取图像/img/banner.jpg,这显然是错误的。

我已经考虑了一些选项,但它们对我来说似乎都不完美:

  • 使用 url 重写将来自 ( *.css | *.js |...) 或 ( css/* | js/* |...) 的请求重定向到正确的路径。

    问题:每个扩展都必须在重写规则中命名。如果有人要添加新的文件类型(例如 mp3 文件),它不会被重写。

  • 使用 php 函数为每个相对路径添加基本路径。例如:
    <img src="<?php echo url::base(); ?>img/banner.jpg" />

    问题:看起来很乱;包含路径的css - 和js -文件必须由 PHP 处理。

那么,如何保持网站目录的独立性?有没有比我想出的更好/更清洁的方法?

4

4 回答 4

8

你可以放在头上

<base href="<?php echo url::base(); ?>" /> 

这意味着浏览器将请求与该路径相关的任何非绝对 URL。但是我不确定这将如何影响嵌入在 CSS 文件等中的 URL。这不会影响 CSS 文件中定义的路径。(感谢 mooware)

于 2008-11-09T20:32:43.243 回答
2

这个<base>东西会起作用,但你需要记住它<a>也会影响你的标签。考虑这个例子:

<!-- this page is http://oursite.com/index.html -->
<html>
 <head>
    <base href="http://static.oursite.com/" />
 </head>
 <body>
    <img src="logo.gif" alt="this is http://static.oursite.com/logo.gif" />
    <a href="/login">this links to http://static.oursite.com/login which is not what we wanted.  we wanted http://oursite.com/login</a>
 </body>
</html>

如果您使用 PHP 函数调用来创建链接,那将不是问题,因为您只需确保它输出绝对 URL。但是,如果您(或您的设计师)对标签进行手工编码,<a>那么您又会遇到同样的问题,只是现在使用<a>而不是<img>.

编辑:我应该添加上面的段落是假设您像我们一样从不同的主机名提供图像。如果你不这样做,那么显然这不会是一个问题。

于 2008-11-10T13:37:38.073 回答
1

tomhaigh 有一个很好的观点,值得进一步调查。

根据MSDN基本标签适用于所有外部资源,包括样式表、图像等。

于 2008-11-09T21:31:27.387 回答
1

也许我错过了一些东西,但你不能做我(我认为其他人)做的事吗?即将你所有的图片、css、javascripts等放在一个公共目录中,即:

/inc/images/
/inc/css/
/inc/javascript/
etc

然后使用基本相对 URL 引用它们,即:

<img src="/inc/images/foo.jpg" />
etc

?

于 2008-11-09T22:30:17.843 回答