无需使用 PHP 重写 Mod


Eliminating the need for Mod Rewrite with PHP

目前在我的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 参数,我会丢失这个"漂亮的 url"。我已经看到其他框架不需要 Mod 重写就可以做到这一点,如果有人能给我一个简单和/或适当的示例来说明如何做到这一点,或者解释它,我希望它。

谢谢!

通常的方法是将所有内容*重定向到应用程序的主 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 中提取参数的正则表达式。

下面的代码是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>

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

您可以查看我对这个类似问题的回答,以获取一些实现作为示例。

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

您可以在 url 中传递一些信息,如下所示:

url.com/Theme/register

请参阅此页面