【问题标题】:ajax post request to php $_POST vars empty对 php $_POST vars 的 ajax 发布请求为空
【发布时间】:2014-02-12 00:59:53
【问题描述】:

我有一个 nginx 重写规则,将 img src 属性重定向到 php 页面。在这个 php 页面中,我正在尝试发出 GET 请求,该请求成功后会向同一页面发出 POST 请求,将从 GET 请求返回的数据作为数据发送。为什么 php 脚本中的 $_POST 数据为空?如果我在 php 脚本中对 $name = "http://path/to/my/img.png" 进行硬编码,图像会正确呈现。

<?php 
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
var_dump($_REQUEST);
//if(isset($_POST['val'])) {


  // open the file in a binary mode

  $name = $_POST['val']; // ALWAYS EMPTY
  $fp = fopen($name, 'rb');

  // send the right headers
  header("Content-Type: image/png");
  header("Content-Length: " . filesize($name));

  // dump the picture and stop the script
  //echo fpassthru($fp);
  header("Location: $name");
  exit;

//}
?>
<html>
<head>
<script type='text/javascript' src='/steal/steal.js'></script>
<script type="text/javascript" src="/plugins/jquery/json2.js"></script>
<script type="text/javascript">
steal('jquery/dom/fixture').then(function(){

$.fixture("GET /event/{code}", function(original, settings, headers){
    return [200, "success", { "img_url":"http://path/to/my/img.png" }, {} ]
})

var strObj = <?php echo json_encode($_REQUEST); ?>;
var str = strObj.q;
var eventCode = str.split('/')[1];
$.ajax({
  url: "/event/"+eventCode,
  success: function(data) {
     var imgUrl = data.img_url
     $.ajax({
        type: 'POST',
        contentType: 'json',
        data: {val:imgUrl},
        success: function(data){
           console.log(data);
        },
        error: function(jqXHR, textStatus, errorThrown){
           console.log(textStatus);
        }
     });
   }
});

});
</script>

</head>
<body>

</body>
</html>

【问题讨论】:

  • 好的,等一下。你试图让图像的 src 指向这个 php 页面,在那个 php 页面内你输出 javascript(据称是为了让用户浏览器运行),然后将一个 POST 请求与他们的数据发送到相同的 url刚刚进入 GET?
  • 这用于电子邮件跟踪。基本上,用户将收到一封电子邮件,并在打开该电子邮件时 img src 属性向 uri 发出请求,然后将其重写为 php 脚本。 php 脚本接收 $_REQUEST 数据——包含一些与用户绑定的 id,使用该 id 发出 GET 请求,成功时返回一个 url。从这里开始,url 被用作对同一 php 页面的 POST 请求的数据,该页面将被 base64 编码并作为 img src 属性返回。这听起来对我来说也很复杂,所以我愿意接受建议。

标签: php jquery ajax nginx


【解决方案1】:

好吧,你已经采取了一些超出可能的步骤。

当用户在他们的电子邮件中点击此图片时,会向您的服务器发送一个请求,请求该图片。因为&lt;img&gt; 标签需要的是图像,而不是html 文档,所以这些javascript 都不会返回给用户。您可以通过

之类的方式将事情附加到传出请求上
<img src="http://yourwebsite.com/tracker.php?val=someimage.png">

您的脚本将能够从$_GET 中获取val,但您将无法从电子邮件中对此图像发出 POST 请求。

所有$_REQUEST 数据您都在顶部吗?您可以从那里获取所有电子邮件跟踪数据。你能从那里得到的一切,$_GET 就是你得到的一切。

之后,您需要将图像还给他们。所以这就是你如何做到这一点的。

$val = $_GET['val']; // assuming val contains an image

header('Content-Type: image/png');
readfile('/path/to/your/images/'. $val);

请注意,您需要检查$val 以确保其仅包含您希望能够看到的图像。潜在的恶意用户可能会看到此内容并输入类似tracker.php?val=/etc/passwd 或类似内容的内容,然后您就会让 PHP 尝试读取您的密码文件。可以使用is_readable() 函数确保图像存在甚至可以读取。

【讨论】:

  • 谢谢。通过在 php 中做所有事情,我实际上已经走得更远了。我已经成功渲染了图像,但现在需要渲染 base64 编码的图像,我不确定这是否可行。 `$response = http_get("google.com", array("timeout"=>1), $info); // 充当夹具。 $info['img_url'] = 'path/to/my/img.png'; $img_url = $info['img_url']; $img = file_get_contents($img_url); $img_data = base64_encode($img); header("内容类型:图片/png"); header("位置:$img_url"); //作品 echo "data:image/png;base64,$img_data"; //无效退出;
  • 这里的问题是,一旦 html 到达用户的收件箱,就不能再修改它了。在呈现 html 并将其发送给用户之前,您必须回显 base64 编码的图像。没有办法解决这个问题。大多数人对跟踪图像所做的就是将其作为单个像素图像与电子邮件的其他正常内容一起放置在电子邮件中的某个位置。
  • 我就是这么想的。由于越来越多的电子邮件被标记为带有 1px 图像的垃圾邮件,因此要求使用实际的公司徽标。我还不能在电子邮件客户端中实际测试这一点,header("Content-Type: image/png"); header("Location: $img_url"); 部分是否可以在电子邮件客户端中工作?
  • header("Location: $img_url"); 替换为readfile($img_url); 以便php页面吐出图片。
  • 到目前为止,当我在浏览器中查看 html 文档时,图像正在呈现,但是,我必须在电子邮件客户端中检查它以进行验证。感谢您的帮助。
猜你喜欢
  • 2016-08-29
  • 2018-07-09
  • 1970-01-01
  • 2016-10-07
  • 2012-11-06
  • 2015-09-18
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多