如果有很多规则,我们如何在Apacheforphp中高效地编写URL重写规则


How can we write URL rewriting rules efficiently in Apache for php, if there are many rules?

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

有没有办法,我们可以有效地将重写规则应用于一长串规则?

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

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

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

编辑:此解决方案中没有实际开销。你只是创造了无限的灵活性。你只需要一些东西:

A)一个url解析器。你可以想怎么复杂就怎么复杂。你可以让它分解url,就这样。你可以用反射等复杂功能来扩展它。一个极简主义的url解析器可能包含5行代码。(获取url,爆炸,返回数组。)

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

第一个自变量总是某种控制器吗?然后试着找到那个控制器。第二个论点总是行动吗?在该控制器中搜索相应的操作。

或者。。。第一个参数总是解析为特定的页面吗?然后包括特定的页面。

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

编辑2哦,还有其他的事情——如果你实现了这个解决方案,你最终得到了一个包含100个案例的switch语句或一个无休止的if/else条件块:你做错了。您应该始终能够进行某种自动路由。

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

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

这个答案有点太长了,而且更多地阐述了其他话题,而不仅仅是你的要求,对此我感到抱歉

我同意Robin诉G.

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