mod_rewrite奇怪的无限递归

时间:2016-11-09 10:16:52

标签: .htaccess mod-rewrite

服务器是Apache 2.4.18,PHP ver 7.0 ...

说明: 在php端,我在创建html链接时使用rawurlencode($ name)。

REQUEST_URI看起来像这样:

function addImagesToArray(){
      alert("clicked!");
}

差异只在一个空间 this / that this / that

/lang/cat1/cat2/product with bla (this/that)    -- works
/lang/cat1/cat2/product with bla (this/ that)   -- infinite internal redirect

我想要的只是标准的前端控制器,所有请求都应该转到file.php。这种情况在99.99%的情况下有效。但是带有VirtualHost: # I have tried different combinations of AllowEncodedSlashes On AllowEncodedSlashes NoDecode. htaccess: <IfModule mod_rewrite.c> Options +FollowSymLinks -MultiViews #different combinations RewriteEngine On # tried different combinations #RewriteCond %{REQUEST_URI} !^/?file\.php$ #RewriteCond %{ENV:REDIRECT_STATUS} ^$ #RewriteCond %{ENV:REDIRECT_STATUS} !200 RewriteRule .? file.php [L] # END </IfModule> 的ruri会进行无限递归。

问题: 为什么会这样? 怎么解决?

2 个答案:

答案 0 :(得分:0)

您需要取消注释上次重写条件。

尝试:

<IfModule mod_rewrite.c>
Options +FollowSymLinks -MultiViews     #different combinations
RewriteEngine On


# tried different combinations
#RewriteCond %{REQUEST_URI} !^/?file\.php$
#RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{ENV:REDIRECT_STATUS} !200


# END
</IfModule>

否则您的规则会将 /file.php 重定向到自身。

在apache 2.4上,您只需使用END标志来终止重写处理:

RewriteEngine on

RewriteRule .? file.php [END] 

答案 1 :(得分:0)

我在另一个论坛找到了解决方案 解决方案很简单。但可能对某人有帮助。

一个人伤心:Be brave, understand that there is nothing wrong with your htaccess! But you still have recursions. So bug is somewhere in php code.

这破坏了我的htaccess固定,让我可以深入了解商业和fw代码。几小时后发现了Bug。 url函数之一具有早熟的rawurldecode()。对于懒惰程序来说很酷,如果你有带编码/名字的产品,那就太酷了。

但问题的回答“这是否有效?”也有误导性。 “是的,当然。这一定是因为重新迁移。” Riiight;)