PHP 中的路由 URL

Posted

技术标签:

【中文标题】PHP 中的路由 URL【英文标题】:Routing URLs in PHP 【发布时间】:2011-08-31 01:21:01 【问题描述】:

我正在做一个网页项目。为此,我决定使用 Apache、php(5.1.7,我的服务提供商强加的版本)和 Dwoo(模板)。

我想将 URL 路由到我的模板。我知道有很多框架在做这种事情。我只是想知道是否有一个很好的方法来实现它。

我的项目设置如下:

src/dwoo - Dwoo 文件 index.php - 这应该处理路由。目前它只是使用模板呈现网站的首页。 模板 - 代表实际页面的模板。

业务逻辑数量最少(没有真实模型)。这只是非常静态的页面。使用模板使维护工作更容易(即继承)。

知道在这种情况下如何设置路由吗?我猜理想情况下,每个给定的 URL 都应该通过 index.php 路由,然后以某种方式决定要呈现哪个模板(即 /category/pagename 将映射到 templates/category/pagename.tpl)。

【问题讨论】:

【参考方案1】:

使用mod_rewrite 将所有内容路由到单个index.php 文件。然后检查此文件中$_SERVER['REQUEST_URI'] 中的变量以调度到所需的处理程序。

此配置将启用mod_rewrite,如果已安装:

DirectorySlash Off
Options FollowSymLinks Indexes
DirectoryIndex index.php

RewriteEngine on

RewriteCond %REQUEST_FILENAME  -d
RewriteRule  ^.*$  -  [L]

RewriteCond %REQUEST_FILENAME  -f
RewriteRule  ^.*$  -  [L]

RewriteRule ^.*$    index.php [L]

【讨论】:

谢谢。是否需要“Options FollowSymLinks Indexes”部分?我的主机似乎失败了(内部服务器错误)。没有它,我在尝试访问索引以外的其他页面时收到“在此服务器上找不到请求的 URL /appname/index.php”。也许忘记 Apache 并弄清楚如何将模板呈现为 html 可能会更整洁〜之前〜我将任何内容上传到服务器...... FollowSymlinks 仅在您使用符号链接时才需要。它可能不是严格需要的。需要Indexes ,否则请求/ 将不会呈现index.php。当您收到Internal Server Error 时,请查看 Apache 的错误日志以了解问题所在。 离线渲染文件是一个好主意,原因有很多,但实际上它会变得相当复杂。如果你想要这个,我建议你使用现有的包,比如 Jekyll。 好的。我只是为了踢球而试一试。我设法让它生成 HTML 就好了。现在我只需要解决一些路径问题(相对 CSS 等)。 :) "需要索引,否则请求 / 不会呈现 index.php。" - 这是完全错误的。如果没有找到索引文件,Indexes 会启用目录列表。 DirectoryIndex 是使 index.php 可用的指令【参考方案2】:

就像 trolskn (+1) 描述的那样:

使用mod_rewrite 将所有内容路由到单个index.php 文件。然后检查此文件中$_SERVER['REQUEST_URI'] 中的变量以调度到所需的处理程序。

但我发现以下.htaccess(与index.php 一起放置在应该“消耗”它之后的所有内容的文件夹中)更有帮助:

Options -MultiViews
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php [QSA,L]

另外我想指出你可能会遇到该消息

.htaccess: Invalid command 'RewriteEngine', perhaps misspelled
or defined by a module not included in the server configuration

这可以通过sudo a2enmod rewrite && sudo service apache2 restart (source) 轻松解决

【讨论】:

【参考方案3】:

您可能想使用 PEAR 的 Net_URL_Mapper。

【讨论】:

以上是关于PHP 中的路由 URL的主要内容,如果未能解决你的问题,请参考以下文章

laravel中的路由

CakePHP 中的反向路由基于 Slug 的 URL

PHP路由技术的原理与实践

Codeigniter 中的路由

我如何路由到控制器并在 codeigniter 中运行?

php 的路由简介 (一个简单的路由模式)