.htaccess 会导致循环吗?

Posted

技术标签:

【中文标题】.htaccess 会导致循环吗?【英文标题】:Could .htaccess cause looping? 【发布时间】:2012-01-12 20:24:13 【问题描述】:

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

在跟踪问题数小时后,我终于得出结论,这不是由数据库本身引起的(100% 肯定),也不是由我编写的极其简单的一段 php 代码引起的(也 100% 肯定)。 尽管如此,问题还是发生在不同的服务器上。我唯一的结论是它与我的 .htaccess 文件有关。 在我看来,每个请求似乎在实际导致输出的运行之前处理了几次。

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

重写引擎开启 RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L]

在那个“公共”文件夹中,我还有另一个 .htaccess 文件:

重写引擎开启 RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d RewriteRule ^(.*)$ index.php?requestedurl=$1 [PT,L]

该文件旨在使用 index.php 文件处理每个请求。 注意:如果我重命名index.php文件直接访问,就不会出现问题了。

我根本不明白这种行为,我希望这个星球上的任何人都能做到。 提前致谢, 汉斯

【问题讨论】:

【参考方案1】:

您可以阅读之前的答案:RewriteRule causes page to reload twice

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

【讨论】:

【参考方案2】:

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

我不排除这种可能性,因为程序之类的东西有时会做一些非常随机的事情,但是您需要更多地调试您的 PHP 代码以消除它作为源代码。简单的方法是简单地通过,每次 PHP 做一些重要的事情时,添加一个打印行来指示它正在执行某些特定的功能,特别是对于 mysql 命令。这是查看它为该页面加载所做的一切的快速方法。有时您会惊讶于自己的发现。

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

【讨论】:

亲爱的animuson,感谢您的快速回复。通过让我意识到请求可能会导致二次请求(通过客户端),您给了我一个巨大的线索。不存在的文件也将被重定向到 index.php。例如:HTML 引用了一个丢失的 favicon.ico 文件。删除该行修复了其中一个迭代。我仍然需要找到一个,我在 HTML 中找不到。我将尝试查看该 Apache 日志文件。谢谢。让 PHP 检查请求的 mime 类型并取消任何不期望 HTML 的请求也是一个想法吗?再次感谢,汉斯 请求不会发送他们期望接收的 MIME 类型,但浏览器可以接收到它应该期望的提示(即使它仍然不是发送)。最好将所有资源(例如 CSS、图像和 javascript)包含在一个文件夹中,并将该文件夹排除在您的重写之外。 感谢您的思考!我想我会尝试弄清楚如何排除应该在切除文件夹中的文件,而不是只排除实际存在的文件。另外:我删除了问题的最后一个原因,所以它目前工作正常,没有任何二次请求,谢谢你。

以上是关于.htaccess 会导致循环吗?的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 中的 apache HTTP:X-Forwarded-Proto 导致开发环境中的重定向循环

使用 .htaccess 删除文件扩展名会导致错误

页面未正确重定向 - HTTPS HTACCESS 重写错误

一个简单的 301 重定向会在我的 htaccess 中创建一个无限循环?

Laragon 会忽略 .htaccess 吗?

使用 .htaccess 为 CloudFlare 用户强制使用 HTTPS 和非 WWW