重定向结果为GET,然后是POST

时间:2012-09-14 21:05:24

标签: javascript jquery jquery-ui http redirect

我有一个网页,其功能在显示内容的主脚本和实现所有操作的单独webutil.php脚本之间分配。页面上的Logout按钮非常简单:

<a href="webutil.php?op=logout" class="signout"><span>Logout</span></a>

webutil中的注销操作会清除包含登录信息的会话变量,调用session_destroy(),然后将重定向发送到$_SERVER['HTTP_REFERER'],以便重新显示原始页面。

我将此重定向用于页面上的所有操作,并且效果非常好。但在这种情况下,我注意到一件奇怪的事情。浏览器发送原始页面的GET,然后立即发送同一页面的POST。由于页面不进行任何自己的表单处理,因此这大多是无害的。但是,如果您单击浏览器的“刷新”按钮,则会弹出警告,表示您要重新提交表单。

我在Mac上尝试过Chrome / FF,在Windows上尝试使用IE 9,他们都证明了这个问题。我已经看到有关POST后跟GET的问题,但我无法找到这种情况。

我试图将其缩小到一个简单的测试用例来重现问题,但我无法做到,所以我无法提供一个小提琴。您可以在http://dev.bridgebase.com/barmar_test/new_vugraph/schedule-so.php处尝试整页;用户名“test”登录,密码“test”。它使用了jQuery,jQuery UI和几个插件。 我意识到我不会给你很多东西继续下去;如果你无法弄清楚实际问题,我会很感激如何使用开发者工具跟踪它。有没有办法在浏览器发送POST时设置断点,所以我可以看到上下文?

不要打扰告诉我这个页面的正确方法是使用AJAX,我知道。我从一个旧的非交互式页面开始,我逐步添加了所有交互。我不想从头开始重写它以使其使用AJAX。也许有一天我会有时间重做它,但是现在我继续使用我的意大利面条代码。

1 个答案:

答案 0 :(得分:1)

这是脚本中发生的事情;这不是HTTP问题。重定向将导致使用相同方法(307/308)或GET(302/303)发出的请求。被重定向的GET永远不会变成POST;因此,您的问题与注销脚本中的重定向无关。

在您的情况下,schedule-so.php似乎有某种时区检测代码。这是发生的事情:

首先退出。

GET http://dev.bridgebase.com/barmar_test/new_vugraph/webutil.php?op=logout HTTP/1.1
Host: dev.bridgebase.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.56 Safari/537.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://dev.bridgebase.com/barmar_test/new_vugraph/schedule-so.php
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,es;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: PHPSESSID=ub7ov6vvsrrpgq0g7cdoieqne3

这会导致预期的重定向。

HTTP/1.1 302 Moved Temporarily
Server: nginx/1.2.1
Date: Fri, 14 Sep 2012 23:00:38 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.3-6
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
Location: http://dev.bridgebase.com/barmar_test/new_vugraph/schedule-so.php#

0

浏览器GET s sechedule-so.php。

GET http://dev.bridgebase.com/barmar_test/new_vugraph/schedule-so.php HTTP/1.1
Host: dev.bridgebase.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.56 Safari/537.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://dev.bridgebase.com/barmar_test/new_vugraph/schedule-so.php
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,es;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: PHPSESSID=ub7ov6vvsrrpgq0g7cdoieqne3

然后schedule-so.php以自动提交的表单进行回复。

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Fri, 14 Sep 2012 23:00:38 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.3-6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: private
Content-Length: 989

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <script type="text/javascript">
    function get_tz()
    {
      var now = new Date()
      document.tz_form.offset.value = now.getTimezoneOffset()
      document.tz_form.submit()
    }
  </script>
  <object><noscript>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;  Javascript support is needed for this page (to get your local timezone).<br />
    &nbsp;&nbsp;&nbsp;&nbsp;  Your browser either has no Javascript support,
 or has such support disabled.<br />
    &nbsp;&nbsp;&nbsp;&nbsp;  As an alternative, click <a href="http://dev.bridgebase.com/barmar_test/new_vugraph/schedule-so.php?offset=0">here</a> to continue.<br />
  All times will be GMT.</p>  </noscript></object>
</head>
  <body onload='get_tz()'>
   <form name="tz_form" action="/barmar_test/new_vugraph/schedule-so.php" method="post">
      <input type='hidden' name='offset' />
    </form>
  </body>
</html>

...和onload,JavaScript会导致表单提交,这是POST的来源。

POST http://dev.bridgebase.com/barmar_test/new_vugraph/schedule-so.php HTTP/1.1
Host: dev.bridgebase.com
Connection: keep-alive
Content-Length: 10
Cache-Control: max-age=0
Origin: http://dev.bridgebase.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.56 Safari/537.4
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://dev.bridgebase.com/barmar_test/new_vugraph/schedule-so.php
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,es;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: PHPSESSID=ub7ov6vvsrrpgq0g7cdoieqne3

offset=240

最后登陆日程安排页面。

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Fri, 14 Sep 2012 23:00:38 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.3-6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: private
Content-Length: 35892

...

因此,您需要在schedule-so.php中查找get_tz(),并找出将其发送到浏览器的原因。我的猜测是用户的时区存储在会话中(在注销时会被破解)。

为了更好地了解HTTP请求中发生的情况,请使用Fiddler