如何在PHP中编写简单路由

时间:2013-08-23 00:40:03

标签: php apache mod-rewrite url-routing

我正在使用Cloud9 IDE开发一个项目,在Apache 2.0上运行PHP5。我主要是一名前端开发人员,但我有很好的PHP经验。我熟悉MVC框架,在较小程度上,这个功能是我试图模仿的,但更简单。我尝试实现CakePHP,但发现它对我需要的东西有点过于强大 - 我不想要后端繁重的设置。我想为我的应用程序编写一些自定义的路由机制。

理想情况下,我希望我的网站的每个请求都能通过一个页面(这个自定义的“控制器”),从那里我可以编写自己的逻辑来找出相应的模板,http代码,错误等,包括。我的问题是,我该如何实现这一目标?换句话说,如何通过http://mysite.c9.io/user/view/2http://mysite.c9.io/index.php发出请求,而不是尝试在我的服务器上请求/user/view/2目录?

我对mod_rewrite和.htaccess规则模糊不清,但我怀疑他们可能会在这里发挥作用。

1 个答案:

答案 0 :(得分:1)

首先确保已启用mod_rewrite。检查您的httpd.conf文件

 LoadModule rewrite_module modules/mod_rewrite.so

确保未在前面加#禁用它。接下来将根<Directory>设置更改为

<Directory />
  Options All
  AllowOverride All
</Directory>

确保将AllowOverride None的所有匹配项更改为All。然后重启Apache。

现在已启用mod_rewrite,请将其添加到您的网络根.htaccess目录中的/文件

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} !^/index\.php$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d # not a dir
RewriteCond %{REQUEST_FILENAME} !-f # not a file
RewriteRule ^ index.php [L]

这确保了每个请求本来是404(这意味着它排除图像,css,js等)现在通过前端控制器index.php路由。一些内容管理系统喜欢添加另一个%{REQUEST_URI}检查以确保index.php仅被调用来处理框架实际期望的请求类型。

例如,

Joomla添加以下内容:

RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf))$ [NC]