【问题标题】:PHP runs two requests per request when using rewrite rulePHP 在使用重写规则时每个请求运行两个请求
【发布时间】:2011-02-15 19:05:13
【问题描述】:

我注意到 PHP 已经插入了两次相同的数据,即使是一个简单的查询,下面是我的索引文件:

<?php
require("constants.php"); //contains database settings
$database = new PDO("$type:host=$host;dbname=$name", $user, $pass); 
$query = $database->prepare('INSERT into test (test) VALUES (?)');
$query->execute(array(rand()));
echo $database->lastInsertId();

test 表有一个自动递增列 id 和一个 varchar 列 test。我正在使用 WAMP 运行 PHP 和 mysql。

对页面的每个请求都会插入两个具有不同值的条目(来自rand() 调用)。仅回显第一个插入 ID。对于 Chrome、Firefox 和 IE,此行为相同。

这是由重写规则引起的:

RewriteEngine on
RewriteRule .* index.php

我假设有一个像 robots.txt 或 favicon.ico 这样的文件是透明请求的。

【问题讨论】:

  • 是直接调用 PHP 页面,还是通过 Javascript 或其他方式获取?可能是 javascript 发出了两次请求,而您在某处需要一个 return(false);
  • 直接调用页面,就是索引文件。
  • 如果你点击example.com/somedir可以运行两次,然后指向example.com/somedir/index.php
  • 我唯一能想到的是一个 apache 配置,它模拟了 @Marc B 所描述的内容,或者进一步深入堆栈的东西。您可以在其上下文中发布更多代码吗?它处理什么样的数据?
  • 您有任何可以重定向到 index.php 的重写/错误文档规则吗?可能是页面/浏览器试图加载不同的资源(网站图标等)被重定向到索引?

标签: php wamp duplicate-data


【解决方案1】:

您有任何可以重定向到 index.php 的重写/错误文档规则吗?可能是页面/浏览器尝试加载不同的资源(网站图标等)被重定向到索引?

【讨论】:

  • 是的,见帖子。每个请求会加载哪些资源?
  • 可能是网站图标。如果您有权访问您的日志,您可能会在 apache 访问日志中看到它。否则,您始终可以将 http 请求的转储附加到服务器上的文件中,以查看访问的内容。
【解决方案2】:

您应该使用form token/nonce 来防止这种情况和回复攻击。

http://www.phpro.org/tutorials/Preventing-Multiple-Submits.html

【讨论】:

  • 感谢您提供的信息,但与此问题无关。这是纯粹的开发代码。
猜你喜欢
  • 2011-06-14
  • 2023-02-01
  • 2015-10-09
  • 2017-05-17
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多