目前在我的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
请参阅此页面