POST/Redirect 引发“连接已重置”浏览器错误

Posted

技术标签:

【中文标题】POST/Redirect 引发“连接已重置”浏览器错误【英文标题】:POST/Redirect throws a `Connection was reset` browser error 【发布时间】:2015-09-09 00:40:11 【问题描述】:

我正在为我们的一位客户构建单页结帐。此结帐应包含所有凭证、装运和付款表格。也应该可以编辑以前输入的值。这一切都很好,除了一件事。

我的页面由多个包含:

凭据 发货 付款

在其中的每一个中,我都会检查相关数据是否在会话中,如果是,我会显示不同的视图。这里没什么特别的。

例如:

<?php
if (is_array($_SESSION['credentials'])) 
    ... show filled in values ...
 else 
    ... show form ...

?>

当值已经设置时,我还会显示一个编辑按钮。我这样做如下:

<div class="left-column">
    <h1 class="title-left">Step 1 - Credentials</h1>
    <div class="pull-left" style="width: 50%;">
        Name: name<br />
        Address: Address 11<br />
        Postal Code: 12345AA<br />
        Country: Country<br />
    </div>

    <br />
    <div style="clear: both;height: 10px;"></div>
    <center>
        <form method="POST" action="/checkout/credentials/">
            <input type="hidden" name="edit" value="credentials">
            <button class="sexybutton sexysimple sexybestel">Edit</button>
        </form>
    </center>
</div>

接着是:

<div class="left-column">
    <h1 class="title-left">Step 2 - Shipment</h1>
    <i>Select a shipment method</i>
    <form method="POST" action="/checkout/payment/">
        <input type="radio" value="0" name="shipmentmethod"> Collect<br />
        <input type="radio" value="1" name="shipmentmethod"> Deliver<br />
       <input type="submit" value="Go to Step 3" class="sexybutton sexysimple sexybestel pull-right" name="shipment">
    </form>
</div>

在凭据包括我检查$_POST['edit']。如果已设置,我将再次显示表单,并在输入字段中使用客户先前填写的数据。

问题

每当我第一次单击编辑按钮时,它都会引发Connection was reset 浏览器错误。如果我刷新页面,它会要求我再次提交表单。当我这样做时,错误消失了。我似乎无法弄清楚这是从哪里来的。我检查了服务器日志,但没有任何异常。

*注意:*在发货和付款步骤之间也会出现同样的问题。

相关htaccess

Options       +FollowSymLinks
RewriteEngine On
RewriteBase /

order allow,deny
allow from all
RewriteCond %HTTP_HOST ^tapijttegelhandel\.nl
RewriteRule ^(.*)$ http://www.tapijttegelhandel.nl/$1 [R=permanent,L]
AddDefaultCharset utf-8

RewriteRule ^checkout/               /index.php?mod=checkout&action=show [NC,L,QSA]

index.php

case 'checkout':
    $action = isset($_GET['action']) ? $_GET['action'] : '';
    switch ($action) 
        case 'completed':
            # ...
            break;

        case 'cancelled':
            # ...
            break;

        case 'credentials':
        case 'shipment':
        case 'payment':
        case 'edit':
        default:
            include $_SERVER['DOCUMENT_ROOT'].'checkout/show.php';
            break;
    
    break;

进展

我已经转储了会话变量以查看会话中是否存在异常情况。 (这里没什么奇怪的) 我已经为 Firefox 安装了一个 Tamper Data 插件来检查 POST 数据。 (这里也没什么奇怪的)

更新

我在上次检查所有内容时跳过的代码中发现了一些内容。然而,这可能与我的问题有关。

<script type="text/javascript">    
         window.history.forward();
         function noBack()  
              window.history.forward(); 
         
    </script>
</head>
<body onload="noBack();" onpageshow="if (event.persisted) noBack();" onunload="">

工作流程

/cart GET 200 OK
/checkout/credentials/ GET 304 OK
/checkout/credentials/ POST 304 OK
# edit
/checkout/credentials/ POST - Error 'Connection was reset'
# Refresh
/checkout/credentials/ POST 200 OK

【问题讨论】:

在处理具有某种防火墙的共享主机时,我遇到过一些“连接已重置”的情况。您是否启用了 ModSecurity? “连接已重置”是否需要很长时间?即,可能的超时? @Xeli 不,它实际上立即出现 【参考方案1】:

“连接已重置”

有时可能意味着 php 崩溃。如果没有看到确切的文件,很难猜测是否以及为什么会发生这种情况。

确保检查error_log,输入:php --info | grep 错误以查看它被记录到哪个文件(如果您在 linux/unix 上)。

我的猜测是一个杂散的休息;某处的声明看到这个答案的可能原因:https://***.com/a/20036720/988324

不过,您会在错误日志中找到一些相关的痕迹。如果你能提供这个,我可能会提供更多帮助。

【讨论】:

【参考方案2】:

action="/checkout/payment/" 定义好了吗?我的意思是你可以试试绝对的 url,我看到结尾有一个可疑的斜线/,你也用method="POST" 定义了表单方法,在 index.php 上你应该用$_POST[]不知道这是否会影响

【讨论】:

我会检查你的建议

以上是关于POST/Redirect 引发“连接已重置”浏览器错误的主要内容,如果未能解决你的问题,请参考以下文章

连接已重置,请检查代理

连接已重置,请检查代理

连接已重置,请检查代理

Laravel页面加载问题连接已重置

意外的连接重置:PHP 或 Apache 问题?

Apache Chemistry Nuxeo连接已重置