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版本(2.4)时,重写规则无法工作_Apache_.htaccess_Mod Rewrite_Url Rewriting - Fatal编程技术网

当我使用较新的Apache版本(2.4)时,重写规则无法工作

当我使用较新的Apache版本(2.4)时,重写规则无法工作,apache,.htaccess,mod-rewrite,url-rewriting,Apache,.htaccess,Mod Rewrite,Url Rewriting,我有一个Centos 5 VPS,然后使用Apache2.4转到Centos 7。我不知道我在Centos 5系统上的Apache早期版本是什么,但我知道我的重写规则工作得很好 但是,当我转到Apache 2.4时,我的旧重写规则停止工作: 旧规则: 重写规则^\/[^\.]*$/index.php?页面=$1[NC] 在错误日志中触发此错误: AH00124:由于可能的配置错误,请求超出了10个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“日志

我有一个Centos 5 VPS,然后使用Apache2.4转到Centos 7。我不知道我在Centos 5系统上的Apache早期版本是什么,但我知道我的重写规则工作得很好

但是,当我转到Apache 2.4时,我的旧重写规则停止工作:

旧规则: 重写规则^\/[^\.]*$/index.php?页面=$1[NC] 在错误日志中触发此错误:

AH00124:由于可能的配置错误,请求超出了10个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“日志级别调试”获取回溯。 AH00124:由于可能的配置错误,请求超出了10个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“日志级别调试”获取回溯

我尝试的新规则至少使我的www.domainname.com起作用: 重写规则^[^/]*$/index.php?页面=$1[NC]


Apache2.4有什么不同?我在这里或谷歌上都找不到任何线索。

您需要添加一个RewriteCond,以防止对index.php的请求被重写。我们想到了两种方法:

1仅当请求不针对现有物理文件时才重写:

Options -MultiViews
RewriteEngine on
RewriteCond %{REQUEST_URI} !-f
RewriteRule ^/?([^/]*)$ /index.php?page=$1 [END]
2仅当请求未明确指向/index.php位置时才重写:

Options -MultiViews
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteRule ^/?([^/]*)$ /index.php?page=$1 [END]
领先的^/?确保此模式在.htaccess样式文件和真实http服务器主机配置中工作。这是有道理的,因为:


一般提示:您应该始终希望将此类规则放置在http服务器主机配置中,而不是使用.htaccess样式的文件。这些文件是出了名的容易出错,难以调试,而且它们确实降低了服务器的速度。它们仅在您无法控制主机配置的情况下作为最后一个选项提供:读:非常便宜的主机服务提供商,或者如果您的应用程序依赖于编写自己的重写规则,这显然是一个安全噩梦。

,当然,这将导致重写循环,但这与http服务器版本无关。您可以重写到与您使用的模式再次匹配的目标。由于该规则在每次重写时都会更改目标,因此始终会触发新一轮重写。没完没了地。。。您需要添加一个RewriteCond来防止对index.php的请求被重写…很好。谢谢你的提示。还有一个问题:你如何解释它到现在还不需要重写的事实?不是很确定,我不得不花时间在上面,甚至测试它。。。当然,旧模式应该避免循环,因为它不接受点。在请求中,虽然这显然是一个非常粗鲁的策略。。。也许这只是臭名昭著的多视图指令的作用。。。但是无论如何:重写确实有意义…谢谢你的回答和额外的提示。幸运的是,我没有使用.htaccess文件:。关于答案,这正是我所需要的。请更新此规则:RewriteRule^/?[^]$/index.php?page=$1[END]*要重写rule^/?[^/]$/index.php?page=$1[END]*以便其他人可以看到确切的正确答案。再次感谢你。另外,很难注意到,一个反斜杠就是一个斜杠@besciualex对规则的修改毫无意义,抱歉。该模式将只匹配由一个字母组成的请求URI…但它不能使用反斜杠。这就是我更新它的原因。@besciualex啊,对不起,当然,把反斜杠改成了正斜杠。不知道这是从哪里来的,有一个全新的键盘布局,也许这就是原因;-修正了,再次谢谢。我的回复是指明星运营商*你的建议也删除了在我看来没有意义的内容。Aaa!我的错!这是一个特殊的角色,我在上面的评论中没有逃避它。