首页 文章

.htaccess会导致循环吗?

提问于
浏览
3

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

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

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

<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteRule    ^$    public/    [L]
        RewriteRule    (.*) public/$1    [L]
    </IfModule>

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

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php?requestedurl=$1 [PT,L]
    </IfModule>

此文件旨在使用index.php文件处理每个请求 . 注意:如果我重命名index.php文件并直接访问它,则不会发生此问题 .

我根本就没有得到这种行为,我希望这个星球上的任何人都这样做 . 先谢谢,汉斯

2 回答

  • 3

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

    我不排除这种可能性,因为程序等有时可以做一些非常随机的事情,但你需要更多地调试你的PHP代码以消除它作为源 . 简单的方法就是简单地完成每次PHP执行主要操作时,添加一条打印行以指示它正在执行某些特定功能,尤其是对于MySQL命令 . 这是一种快速查看页面加载所做的工作的方法 . 你有时会发现你会感到惊讶 .

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

  • 2

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

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

相关问题