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的主要内容,如果未能解决你的问题,请参考以下文章