如果我们有许多规则无法规范化,那么.htaccess中会有一长串规则,这些规则很可能表现为if-else条件。
有没有办法,我们可以有效地应用重写规则来获取长长的规则列表?
答案 0 :(得分:5)
是的,根本不使用.htaccess。只需将所有内容(图像,js,css等除外)重新路由到index.php并在PHP中处理路由业务,而不是在.htaccess中。
使用.htaccess是一种痛苦。只需将所有内容转发到index.php并从那里开始。如果网址是www.google.com/test/bla/bla/,则会将其重新路由到www.google.com/index.php/test/bla/bla/。在index.php中,你可以爆炸字符串'test / bla / bla /'来获取数组中的参数。
你可以从那里做任何你想做的事。
编辑: 这个解决方案没有真正的开销。您只需创造无限的灵活性。你只需要一些东西:
A)网址解析器。您可以根据需要使其变得复杂。你可以让它爆炸网址,就是这样。您可以使用Reflection等复杂功能扩展它。一个极简主义的URL解析器可能包含5行代码。 (获取网址,爆炸,返回数组。)
B)某种路由器/路由机制。根据网址确定您应该在何处发送请求。 url解析器为您提供了一个参数列表 - 该数组的结构是什么?
第一个参数总是某种控制器吗?然后尝试找到该控制器。第二个参数总是一个动作吗?在该控制器中搜索相应的操作。
或者......第一个参数是否始终解析为特定页面?然后包括该特定页面。
这完全取决于您的要求和您的应用程序,但有一点是肯定的:使用.htaccess比使用它更容易。您可以在应用程序开发的任何阶段实现这一点,因为url保持不变,但只有处理方式不同。
EDIT2 哦,还有其他的东西 - 如果你实现这个解决方案,你最终得到一个包含100个案例的switch语句或一个无休止的if / else条件块:你做错了。您应始终能够进行某种自动路由。
如果您的应用程序使用过程代码并且您使用包含:将所有“可包含”页面放在一个文件夹中,并尝试通过包含它来解析该页面。如果它不存在,则抛出错误。无需将每个页面放在switch语句中。 在特定的页面上;检查用户是否有足够的权限查看该页面。 路由时不要这样做,路由器不应该知道安全上下文。
如果您有一个带控制器的面向对象结构,请确保您可以识别“操作方法”。使用docblocks,前缀(doSomething())或其他任何东西来确保路由器只能访问应该从外部访问的方法。至于安全性:不验证是否允许用户在路由器中调用该操作。在面向对象的应用程序中,有100种样式的访问控制管理,但路由器仅用于路由。添加某种安全层,不要让路由器决定用户是否可以进入。如果某些安全机制发现用户没有,您可以重新路由请求没有足够的凭据。重新访问某些“非法请求”页面。
这个答案有点太长了,并且详细阐述了其他主题,而不仅仅是你要求的内容,对不起。 :)
答案 1 :(得分:1)
我同意Robin v.G。
但是如果你的项目到了无法返回并改变PHP中的路由机制的程度,你可以随时使用ReWriteMap