Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
.htaccess htaccess会导致循环吗?_.htaccess_Loops - Fatal编程技术网

.htaccess htaccess会导致循环吗?

.htaccess htaccess会导致循环吗?,.htaccess,loops,.htaccess,Loops,我不是.htaccess的英雄,但我遇到了一个我认为可能是由它引起的问题。 第一个症状是:对我的数据库的简单更改(如用户IP跟踪)在每个请求中都执行了多次,而站点的输出看起来很好 经过数小时的跟踪,我最终得出结论,这不是由数据库本身造成的(100%确定),也不是由我编写的极其简单的PHP代码引起的(也100%确定)。 不过,问题发生在不同的服务器上。我唯一的结论是它与我的.htaccess文件有关。 在我看来,每个请求在实际导致输出的运行之前都会被处理几次 在我的public_html文件夹中,

我不是.htaccess的英雄,但我遇到了一个我认为可能是由它引起的问题。 第一个症状是:对我的数据库的简单更改(如用户IP跟踪)在每个请求中都执行了多次,而站点的输出看起来很好

经过数小时的跟踪,我最终得出结论,这不是由数据库本身造成的(100%确定),也不是由我编写的极其简单的PHP代码引起的(也100%确定)。 不过,问题发生在不同的服务器上。我唯一的结论是它与我的.htaccess文件有关。 在我看来,每个请求在实际导致输出的运行之前都会被处理几次

在我的public_html文件夹中,我放置了以下.htaccess文件,该文件用于将每个请求重定向到“public”文件夹:

重新启动发动机 重写规则^$public/[L] 重写规则(.*)public/$1[L] 在该“公用”文件夹中,我有另一个.htaccess文件:

<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?requestedurl=$1 [PT,L] </IfModule> 重新启动发动机 重写cond%{REQUEST_FILENAME}-F 重写cond%{REQUEST_FILENAME}-D 重写规则^(.*)$index.php?requestedurl=$1[PT,L] 此文件用于使用index.php文件处理每个请求。 注意:如果我重命名index.php文件并直接访问它,则不会出现问题

我就是不明白这种行为,我希望这个星球上的任何人都明白。 提前感谢,,
Hans

理论上不,所有重写规则在任何文件执行之前都会得到处理。唯一可能导致多次调用数据库的是错误的PHP代码,它可能多次调用一行代码,或者在调用后重定向页面,然后htaccess将其重定向回同一页面。单凭htaccess文件是无法做到这一点的

我不排除这种可能性,因为程序等有时会做一些非常随机的事情,但您需要更多地调试PHP代码,以消除它作为源代码的可能性。简单的方法是,每次PHP做一些重要的事情时,添加一个打印行,表明它正在执行某些特定的函数,尤其是MySQL命令。这是一种快速的方法,可以查看它对页面加载所做的一切。有时你会对自己的发现感到惊讶


另外,查看您的Apache访问日志。它将为用户发送的每个GET请求打印新行。如果页面从未重定向,则用户不可能多次运行脚本(如上所述,在确定最终路径之前不会执行任何文件)。如果您同时看到来自同一IP的多个GET请求,则说明页面正在重定向或重新加载。

您可以阅读前面的回答:


这个。htaccess可以循环,甚至无限循环,但最后只有一个服务器请求。所以这不是你的问题。请查看链接,查看浏览器多次发送请求的原因(这种情况比我们通常想象的要多)。

亲爱的animuson,感谢您的快速回复。你给了我一个巨大的线索,让我意识到一个请求可能会导致二次请求(通过客户端)。不存在的文件也将被重定向到index.php。例如:HTML引用了丢失的favicon.ico文件。删除该行修复了其中一个迭代。但是我仍然需要找到一个,这在HTML中找不到。我将尝试查看Apache日志文件以了解这一点。谢谢让PHP检查请求的mime类型并取消任何不需要HTML的请求也是一个好主意吗?再次感谢您,请求不会发送他们希望接收的MIME类型,但是浏览器可以接收到它应该接收的提示(即使它仍然没有发送)。最好将所有资源(如CSS、图像和JavaScript)包含在一个文件夹中,并将该文件夹从重写中排除。谢谢您的思考!我想我将尝试找出如何排除应该在删除文件夹中的文件,而不是只排除实际存在的文件。另外:我删除了问题的最后一个原因,因此它目前运行良好,没有任何二次请求,多亏了您。 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?requestedurl=$1 [PT,L] </IfModule>