如何保持网站与url路由目录的独立性

时间:2008-11-09 20:30:36

标签: php url-routing

我正在开发一个使用网址路由的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处理。

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

4 个答案:

答案 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)

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

根据MSDNbase标记适用于所有外部来源,包括样式表,图片等。

答案 3 :(得分:1)

也许我错过了一些东西,但是你不能只做我(和我认为其他人)做的事情吗?即将所有图像,CSS,javascripts等放在一个共同的目录中,即:

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

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

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