1

我不知道 htaccess 是如何工作的,无论我阅读了多少教程,它的理论都不会在我的脑海中产生联系。

我正在构建一个简单的 MVC 框架,它工作得很好,除了我不喜欢我处理 htaccess 的方式。要正确重写 URL,这就是我正在做的事情:

RewriteEngine on
RewriteRule ^users/([^/]+)(/([^/]+))?$ controller/users.php?method=$1&param=$3

如果我添加一个新控制器,我必须进入 htaccess 并添加一个新行:

RewriteRule ^access/([^/]+)(/([^/]+))?$ controller/access.php?method=$1&param=$3

有没有办法使用通配符字段使其全部自动化,这样我每次更新时都不必访问 htaccess?

4

3 回答 3

3

您可以将解析查询字符串的逻辑移动到您的框架/应用程序中。为此,让您像这样重写规则:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

在这种情况下,对服务器的任何请求都将由 index.php 处理(如果不存在同名的静态文件)。并且 $_SERVER['REQUEST_URI'] 将等于真正的请求 uri - 只需解析它并用于您的逻辑。

例如,如果使用该 .htaccess 发送 /user/registry 请求

$_SERVER['REQUEST_URI'] => '/user/registry'
于 2013-05-07T15:53:02.860 回答
2

你可以试试这个:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)(/([^/]+))?$ controller/$1.php?method=$2&param=$4

如果引用的文件或目录确实存在于磁盘上,则这两个额外规则将跳过重写,例如:它不会尝试重写对http://site.com/images/logo.jpg.

于 2013-05-07T15:49:06.290 回答
0

我会将所有 URI 重定向到index.php并允许另一个完善的 MVC 概念处理控制器调度:Routers.

许多(大多数)MVC(和一些非 MVC)应用程序默认使用它,因为它允许高级路由技术(不仅是控制器/动作结构化 URI)。

控制器可以“注册”(新)路由器并设置它们的优先级。应用程序可以运行所有路由器(按优先级顺序),直到一个路由器找到匹配的路由(并且能够辨别应该使用哪个控制器)。

例如,许多类似博客的应用程序将需要 SEO 友好的 URI,这意味着类似category/subcategory/subsubcategory/blog-article.html. 许多类似 cms 的应用程序将需要相同的分层页面:top-level-page/mid-level-page/low-level-page.html. 以及许多电子商务应用程序都希望在他们的产品中使用:category/subcategory/product.html.

上述 URI 需要一个路由器来检查数据库以找出哪个文章/页面/产品具有该 URI 键。

于 2013-05-07T15:53:37.513 回答