我正在开发一个使用网址路由的PHP网站。我希望该网站与目录无关,因此可以将其从http://site.example.com/移至http://example.com/site/,而无需更改HTML中的每个路径。当我链接到不受路由影响的文件(例如css文件,图像等)时,问题就出现了。
例如,我们假设控制器index
的操作welcome
的视图包含图像img/banner.jpg
。如果使用网址http://site.example.com/welcome请求网页,则浏览器会将图片请求为http://site.example.com/img/banner.jpg,这非常好。但是,如果使用网址http://site.example.com/welcome/index请求网页,则浏览器会认为welcome
是一个目录,并会尝试将图像提取为http://site.example.com/welcome/img/banner.jpg,这显然是错误的。
我已经考虑了一些选项,但它们对我来说似乎都不完美:
使用网址重写来重定向来自( *。css | *。js | ...)或( css / * | js / * | ...)到正确的路径。
问题:每个扩展都必须在重写规则中命名。如果有人要添加新的文件类型(例如mp3文件),则不会重写。
使用php函数将基本路径预先添加到每个相对路径。例如:
<img src="<?php echo url::base(); ?>img/banner.jpg" />
问题:看起来很乱; css - 和 js - 包含路径的文件必须由PHP处理。
那么,如何保持网站目录独立?是否有比我想出的更好/更清洁的方式?
答案 0 :(得分:8)
你可以放在头上
<base href="<?php echo url::base(); ?>" />
这意味着浏览器将请求相对于该路径的任何非绝对URL。 但是我不确定这会如何影响CSS文件中嵌入的URL等。这不会影响CSS文件中定义的路径。 (感谢mooware)
答案 1 :(得分: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>
。
编辑:我应该添加以上段落,假设您像我们一样提供来自不同主机名的图像。如果你没有,那么显然这不会是一个问题。
答案 2 :(得分:1)
答案 3 :(得分:1)
也许我错过了一些东西,但是你不能只做我(和我认为其他人)做的事情吗?即将所有图像,CSS,javascripts等放在一个共同的目录中,即:
/inc/images/
/inc/css/
/inc/javascript/
etc
然后用基础相对URL引用它们,即:
<img src="/inc/images/foo.jpg" />
etc