1

如果我们有许多无法规范化的规则,那么 .htaccess 中将有一长串规则,这可能表现为一个长的 if-else 条件。

有什么办法,我们可以有效地为一长串规则应用重写规则?

4

2 回答 2

5

是的,根本不使用 .htaccess。只需将所有内容(图像、js、css 等除外)重新路由到 index.php 并在 PHP 中处理路由业务,而不是在 .htaccess 中。

使用 .htaccess 很痛苦。只需将所有内容转发到 index.php 并从那里开始。如果 url 是 www.google.com/test/bla/bla/,它将被重新路由到 www.google.com/index.php/test/bla/bla/。在 index.php 中,您可以分解字符串 'test/bla/bla/' 以在数组中获取您的参数。

你可以从那里做任何你想做的事情。

编辑: 这个解决方案没有真正的开销。你只是创造了无限的灵活性。你只需要一些东西:

A)一个网址解析器。您可以根据需要将其复杂化。你可以让它爆炸网址,就是这样。您可以使用Reflection等复杂的功能对其进行扩展。一个极简的 url 解析器可能包含 5 行代码。(获取url,分解,返回数组。)

B)某种路由器/路由机制。根据 url 确定您应该发送请求的“位置”。url 解析器给了你一个参数列表——那个数组的结构是什么?

第一个参数总是某种控制器吗?然后尝试找到该控制器。第二个参数总是一个动作吗?在该控制器中搜索相应的操作。

或者......第一个参数是否总是解析到特定页面?然后包括该特定页面。

这一切都取决于您的要求和您的应用程序,但有一件事是肯定的:使用它总是比使用 .htaccess 更容易。您基本上可以在应用程序开发的任何阶段实现这一点,因为 url 保持不变,但只有处理方式不同。

EDIT2 哦,还有别的东西——如果你实现了这个解决方案,你最终得到一个有 100 个 case 的 switch 语句或一个无穷无尽的 if/else 条件块:你做错了。您应该始终能够拥有某种自动路由。

如果您的应用程序使用过程代码并且您使用包含:将所有“可包含”页面放在一个文件夹中,然后尝试通过包含它来解析页面。如果它不存在,则抛出错误。无需将每一页都放在 switch 语句中。在特定页面本身上;检查用户是否有足够的权限查看该页面。不要在路由时这样做,路由器不应该知道安全上下文。

如果您有一个带有控制器的面向对象结构,请确保您可以识别“操作方法”。使用文档块、前缀 (doSomething()) 或其他任何东西来确保路由器只能访问应该从外部访问的方法。至于安全性:不要验证是否允许用户在路由器中调用该操作。在面向对象的应用程序中有 100 种访问控制管理方式,但路由器仅用于路由。添加某种安全层,不要让路由器决定用户是否可以进来。如果某些安全机制发现用户没有足够的凭据,您可以重新路由请求。重新路由到某些“非法请求”页面。

这个答案有点太长了,并且详细说明了其他主题,而不仅仅是您要求的内容,对此我很抱歉。:)

于 2012-09-04T13:32:24.353 回答
1

我同意 Robin v. G.

但是,如果您的项目到了无法返回并更改 PHP 中的路由机制的地步,您始终可以使用ReWriteMap

于 2012-09-04T13:55:33.613 回答