2

At the moment using .htaccess in my PHP Application to choose which page I'm rendering, so for example if the URL is url.com/register, it is actually url.com/index.php?page=register and it gets the content of /Theme/register.html.

Here it is:

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

Thing is, I am not happy with this since if I want to use another GET parameter I'd lose this 'pretty url'. I have seen other frameworks that do it without the need of Mod rewrite and I'd like it if someone could give me a simple and/or proper example of how to do it, or explain it.

Thanks!

4

4 回答 4

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>
于 2012-06-22T22:28:42.850 回答
1

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

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

于 2012-06-22T22:24:44.993 回答
0

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

于 2012-06-22T22:22:25.483 回答
0

您可以像这样在 url 中传递一些信息:

url.com/Theme/register

看到这个页面

于 2012-06-22T22:22:34.193 回答