奇怪的302重定向打破我的$ _POST

时间:2009-12-07 23:53:27

标签: php html

我正在从一个表单提交到另一个应该处理它的php页面。问题是当我尝试读取它时,$ _POST通常是空的。

这是表格:     

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Order Form</title>
</head>


<body>
    <form id="mailorder" name="mailorder" action="mailordertest.php" method="post">
        <input type="hidden" name="A212-M" value="1" /> 
        <input type="hidden" name="A212-XXXL" value="2" /> 
        <input type="hidden" name="A212-XXL" value="3" /> 
        <input type="hidden" name="A212-XL" value="4" /> 

        <input type="submit" value="Confirm Order">
    </form>
</body>
</html>

这是处理页面:

<?php
    session_start();
    error_reporting(E_ALL);

    print_r($_POST);
?>

这通常只输出Array(),但有时数据会第一次出现。当$ _POST为空时,我可以回击然后重新提交,经过几次尝试后,它会起作用。

我已经使用FireBug检查了整个shebang,似乎$ _POST正在被清除,因为处理页面将302重定向回自身(显然使用了GET,因此POST数据被丢弃)。

我已将谷歌搜索到死亡,但我找到的答案都没有任何帮助。以下不是问题: 1. post_max_size设置为8M(不是MB) 2.没有CONTENT_TYPE问题

其他PHP应用程序在服务器上工作正常(Wordpress等),我使用的是PHP 5.2.9。

我对这一点感到非常难过 - 所以感谢任何想法和帮助!

编辑:我还应该提到我已经尝试了各种禁用缓存的方法,但也没有成功。

5 个答案:

答案 0 :(得分:1)

查看this link

长话短说:

  

这让我确信他们实际上是在向我发送看起来像POST数据但由于某种原因PHP $ _POST数组仍然是空的。长话短说,我发现了什么,希望能够在某些时候节省一些人的是,如果Content-Type为空或在HTTP消息中无法识别,则PHP $ _POST数组为空。

答案 1 :(得分:1)

我认为您的本地网络和/或计算机可能会发生一些事情。如果我转到

页面
http://www.ruby.za.net/fstest.php
在Firefox中

并点击提交,我看到了

Array
(
    [A212-M] => 1
    [A212-XXXL] => 2
    [A212-XXL] => 3
    [A212-XL] => 4
    [submit] => Confirm Order
)
Array
(
    [UNIQUE_ID] => Sx2qR0gOsRsAAFP-3GUAAAAB
    [HTTP_HOST] => www.ruby.za.net
    [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => en-us,en;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
    [HTTP_KEEP_ALIVE] => 300
    [HTTP_CONNECTION] => keep-alive
    [HTTP_REFERER] => http://www.ruby.za.net/fstest.php
    [HTTP_COOKIE] => PHPSESSID=1143682669e6297436eea3af99e14d4c
    [HTTP_PRAGMA] => no-cache
    [HTTP_CACHE_CONTROL] => no-cache
    [CONTENT_TYPE] => application/x-www-form-urlencoded
    [CONTENT_LENGTH] => 62
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => <address>Apache/2 Server at www.ruby.za.net Port 80</address>

    [SERVER_SOFTWARE] => Apache/2
    [SERVER_NAME] => www.ruby.za.net
    [SERVER_ADDR] => 72.14.177.27
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 71.193.197.39
    [DOCUMENT_ROOT] => /home/ruby/domains/ruby.za.net/public_html
    [SERVER_ADMIN] => webmaster@ruby.za.net
    [SCRIPT_FILENAME] => /home/ruby/domains/ruby.za.net/public_html/mailordertest.php
    [REMOTE_PORT] => 63515
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => POST
    [QUERY_STRING] => 
    [REQUEST_URI] => /mailordertest.php
    [SCRIPT_NAME] => /mailordertest.php
    [PHP_SELF] => /mailordertest.php
    [REQUEST_TIME] => 1260235335
    [argv] => Array
        (
        )

    [argc] => 0
)

每当我遇到这样的问题时,我都会使用curl将一些数据发布到页面上以查看会发生什么

$ curl -d "A212-M=1" -d "A212-XXXL=2" -d "A212-XXL=3" -d "A212-XL=4" -i http://www.ruby.za.net/mailordertest.php
HTTP/1.1 200 OK
Date: Tue, 08 Dec 2009 01:27:13 GMT
Server: Apache/2
X-Powered-By: PHP/5.2.9
Set-Cookie: PHPSESSID=c6baea21344f3f3754064a658ede739c; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding,User-Agent
Content-Length: 1236
Content-Type: text/html

Array
(
    [A212-M] => 1
    [A212-XXXL] => 2
    [A212-XXL] => 3
    [A212-XL] => 4
)
Array
(
    [UNIQUE_ID] => Sx2rcUgOsRsAAE-8zJ8AAAAK
    [HTTP_USER_AGENT] => curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
    [HTTP_HOST] => www.ruby.za.net
    [HTTP_ACCEPT] => */*
    [CONTENT_LENGTH] => 41
    [CONTENT_TYPE] => application/x-www-form-urlencoded
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => <address>Apache/2 Server at www.ruby.za.net Port 80</address>

    [SERVER_SOFTWARE] => Apache/2
    [SERVER_NAME] => www.ruby.za.net
    [SERVER_ADDR] => 72.14.177.27
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 71.193.197.39
    [DOCUMENT_ROOT] => /home/ruby/domains/ruby.za.net/public_html
    [SERVER_ADMIN] => webmaster@ruby.za.net
    [SCRIPT_FILENAME] => /home/ruby/domains/ruby.za.net/public_html/mailordertest.php
    [REMOTE_PORT] => 63558
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => POST
    [QUERY_STRING] => 
    [REQUEST_URI] => /mailordertest.php
    [SCRIPT_NAME] => /mailordertest.php
    [PHP_SELF] => /mailordertest.php
    [REQUEST_TIME] => 1260235633
    [argv] => Array
        (
        )

    [argc] => 0
)

如果curl请求导致数组为空,则表示您的网络存在问题。

如果curl请求有效(如上所述),那么您就遇到了浏览器问题。尝试切换到干净的IE / Safari / Opera,看看你是否遇到了同样的问题。另外,请尝试禁用所有Firefox扩展,以查看是否有人干扰浏览器操作。

答案 2 :(得分:0)

唯一可以产生302s的东西就是沿线某处的.htaccess重写语句。你能检查一下吗?

另外,您在网站上使用任何类型的登录信息吗?

答案 3 :(得分:0)

不是PHP专家,但我想到的一件事是使用session_start。

我会假设你正在为你的会话使用cookie(如果你以某种方式使用查询字符串,那么我确定你现在已经抓住了) - 在标题中发送cookie并且必须在之前发送任何页面内容。如果在调用之前呈现内容,则可能是页面重定向,因为它需要有机会添加会话cookie。这也与您的“重复尝试工作”方案一致。通常罪魁祸首是在一个?之后的几个白色空间。标签

您可以通过删除会话调用或使用标题检查器来查看重定向是否确实设置了Cookie来测试此操作。如果是这种情况,您需要提前调用session_start,以便它可以写入标头。我相信PHP有一个推迟内容传递的调用,以便您可以在页面循环期间添加标题,但我不知道确切的调用,并且出于性能原因建议不要使用它。

答案 4 :(得分:0)

这是工作流吗?

  • 将POST格式化为mailordertest.php
  • mailordertest.php重定向到fstest.php
  • fstest.php根据代码示例写出$_POST的值。

如果这是工作流程,那么$_POST数据没有正确传播(正如您所指出的那样)也就不足为奇了。

因此,请检查mailordertest.php并搜索任何header()来电。如果您希望fstest.php能够访问$_POST数据,请将session_start调用移至mailordertest.phpinclude() fs_test.php的顶部。 mailordertest.php(或者,更好的是,在顶部包含fstest.php并将其功能包装在函数中以便在正确的时间调用。