2010-04-07 111 views
0

我从头开始在PHP中开发MVC框架;主要是为了学习体验,但这可能很容易在实时项目中结束。我经历了这个tutorial作为一个基地,我从那里扩大。MVC框架中的URL路由 - PHP

的请求作出这样的:

examplesite.com/controller/action/param1/param2/等等...

这是我的.htaccess文件:

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA] 

因此,所有请求都会转到index.php,并从那里发送到正确的控制器和操作。如果没有给出控制器或动作,则为两者假设默认的“索引”。

我有一个索引控制器与索引行动,这应该是我的网站的主页。我可以访问examplesite.com访问它(因为索引部分是假设的)。它有一些图像,一个样式表的链接和一些脚本。它们与相对于index.php的路径相链接。我认为这会很好,因为所有的请求都转到index.php上,所有的内容都简单地包含在这个页面中。如果我去examplesite.com这工作。我会看到所有的图像和样式,脚本将运行。 但是,如果我访问examplesite.com/index,我会路由到该网站的正确部分,但所有链接都不起作用。浏览器是否认为我在不同的文件夹中?

我想能够使用相对路径为我的网站的所有内容,否则我需要使用绝对路径无处不在,以确保事情会显示。这可能吗?

回答

2

您需要一个绝对路径,因为浏览器评估相对于当前的请求URI的相对路径(除非你使用的基本标记,见下文) 。请注意,尽管绝对路径并不意味着您需要在其中包含域名。简单地以正斜杠开始就足够了。这是相对于服务器的绝对路径,可以这么说。

所以:

<img src="/images/bla.gif">

<img src="images/bla.gif">

代替......会工作得很好。

正如我提到的,另一种方法是使用base tag。但由于我现在不记得的原因,我相信建议不要使用它。 (如果有人想要在这里......)

+0

是的。这是我一直在做的,但我不熟悉标签。我得看看这个词是什么。 – Walderman 2010-04-07 23:56:19

+1

但是现在我们如何在本地主机上运行多个网站? – Petah 2011-02-07 10:36:24

+0

@Walderman我听说过使用基本标签和一些罐头框架的问题,具体取决于设置。使用基本标签是很好的,特别是如果你控制世界。 – 2017-03-14 02:13:48

0

IMO图像,JavaScript,样式和其他静态内容应该是而不是是路由系统的一部分。这意味着你可以为每个请求加载PHP(性能重击),当Apache可以很好地处理这些文件时。

我的.htaccess总是让现有文件跳过PHP:

# Files with an extension that exist are served up straight. 
RewriteCond %{REQUEST_URI} \..+$ 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule .* - [L] 
+2

我的系统不会路由这些东西。他们服务普通的旧文件。 – Walderman 2010-04-07 23:56:58

+0

良好的逻辑性和创造性,但不必要。 – 2017-03-14 02:17:45