Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果有很多规则,我们如何在Apache for php中高效地编写URL重写规则?_Php_Apache_Mod Rewrite_Url Rewriting - Fatal编程技术网

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

如果有很多规则,我们如何在Apache for php中高效地编写URL重写规则?,php,apache,mod-rewrite,url-rewriting,Php,Apache,Mod Rewrite,Url Rewriting,如果我们有许多无法规范化的规则,那么在.htaccess中会有一个很长的规则列表,这可能表现为一个很长的If-else条件 有什么方法可以有效地为一长串规则应用重写规则吗?是的,根本不用.htaccess。只需将除图像、js、css等之外的所有内容重新路由到index.php,并用php而不是.htaccess处理路由业务 使用.htaccess是一种痛苦。只需将所有内容转发到index.php并从那里开始。如果url是www.google.com/test/bla/bla/,它将被重新路由到w

如果我们有许多无法规范化的规则,那么在.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/bla/。在index.php中,您可以分解字符串“test/bla/bla/”,以获取数组中的参数

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

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

url解析器。你想怎么复杂就怎么复杂。你可以让它分解url,就这样。你可以用复杂的功能来扩展它,比如,等等。一个最简单的url解析器可能包含5行代码。获取url,分解,返回数组

B某种路由器/路由机制。根据url确定发送请求的“位置”。url解析器为您提供了一个参数列表-该数组的结构是什么

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

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

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

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

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

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


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

是,根本不使用.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/”,以获取数组中的参数

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

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

url解析器。你想怎么复杂就怎么复杂。你可以让它分解url,就这样。你可以用复杂的功能来扩展它,比如,等等。一个最简单的url解析器可能包含5行代码。获取url,分解,返回数组

B某种路由器/路由机制。根据url确定发送请求的“位置”。url解析器为您提供了一个参数列表-该数组的结构是什么

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

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

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

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

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

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


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

我同意罗宾五世的观点。G


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

我同意Robin v。G


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

,我们在PHP中使用相同的if-else条件,但会有一些开销,如explode,不是吗?如果我错了,请举例说明。谢谢罗宾的解释:-我从来没有使用过反射,也不知道它与重写有什么关系。如果你能解释一下,我会很感激的。这样的话,我们在php中使用了相同的If-else条件,但是有更多的开销,比如explode,不是吗?如果我错了,请举例说明。谢谢罗宾的解释:-我从来没有使用过反射,也不知道它与重写有什么关系。如果您能解释一下,我将不胜感激。ReWriteMap似乎是一个不错的选择,但它的局限性是不能在.htaccess中使用,所以除非我们有专用服务器,否则它是不可能实现的。不是真的。。您可以在.htaccess中实现RewriteMap,然后使用不同的txt文件和所有指令。您不需要专用服务器。ReWriteMap似乎是一个不错的选择,但它的局限性是无法在.htaccess中使用,因此除非我们有专用服务器,否则无法实现。不太可能。。您可以在.htaccess中实现RewriteMap,然后使用不同的txt文件和所有指令。你不需要专门的服务器。