使用PHP消除了对Mod Rewrite的需求

时间:2012-06-22 22:18:53

标签: php mod-rewrite routing

目前在我的PHP应用程序中使用.htaccess来选择我正在呈现的页面,例如,如果URL是url.com/register,它实际上是url.com/index.php?page=register和它获得了/Theme/register.html的内容。

这是:

RewriteEngine On
RewriteRule ^(|/)$ index.php?page=$1
RewriteRule ^([a-zA-Z0-9/_-]+)(|)$ index.php?page=$1
RewriteRule ^(.*)\.htm$ $1.php [NC]

事情是,我对此并不满意,因为如果我想使用另一个GET参数,我会失去这个'漂亮的网址'。我已经看到其他框架可以在不需要Mod重写的情况下完成它,如果有人能给我一个简单和/或适当的例子来解释它,我会喜欢它。

谢谢!

4 个答案:

答案 0 :(得分:3)

通常的方法是将所有内容* 重定向到应用程序的主要boostrap文件index.php

  • 当我说一切我的意思是每个URL都不是公共文件系统中的文件或目录。

通过这种方式,PHP得到了令人愉快的工作:解析URL并计算(动态)应该呈现的页面以及已传递的参数。

这就是MVC路由器到位的地方,它们的任务是将URL制作成段并找出哪些段表明你应该使用某个控制器,哪些段表明控制器应该调用一个某些方法以及哪些段是应该传递给方法调用的参数。

此方法在WordPress中使用,例如,URL解析是根据您在管理员中指定的URL结构完成的。

CakePHP也使用它一个MVC框架,允许默认使用以下URL结构:controller_name/method_name/parameter_1:value_1/parameter_2:value_2/。但是可以自定义,例如定义从URL中提取参数的RegEx。

下面的代码是WordPress生成的默认.htaccess。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

答案 1 :(得分:1)

您始终使用mod_rewrite但不确定规则中的页面名称。你jsut将它发送到php,然后你用它来根据模式解析PATH_INFO的正确细节。它叫做路由器。我不知道任何独立的例子,因为它们通常与控制器实现非常相关。

您可以查看我对this similar question的回答,了解一些实现,并将其作为示例进行查看。

答案 2 :(得分:0)

您可以定义应将哪些类型的请求传递给index.php(即:register,delete等)。如果你在htaccess中对其进行硬编码,你仍然可以在你的网址中使用其他子目录。或者在htaccess中添加一个子目录来定义这类请求,例如www.yoursite.com/page/register

答案 3 :(得分:0)

您可以在网址中传递一些信息:

url.com/Theme/register

请参阅this page