首先,我不是在问我是否可以在不使用表单的情况下创建从一个页面到另一个页面的POST响应,或者可能想到的类似问题之一。在我的几个页面的开头,我使用以下require语句自动强制https安全:
<?php
if($port == 80) {
if($_SERVER['SERVER_PORT'] == 443) {
header('Location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER["REQUEST_URI"]);
exit;
}
} elseif ($port == 443) {
if($_SERVER['SERVER_PORT'] == 80) {
header('Location: https://'. $_SERVER['HTTP_HOST'] . $_SERVER["REQUEST_URI"]);
exit;
}
}
?>
其中$port是在调用PHP require之前直接设置的。在某些情况下,从http定向到https(或简单地按人更改URL),从第1页上的表单生成的任何POST变量将在重定向时丢失。
也许我问的是与"no form"相同的问题,但如果是这样,请根据要求提供有关如何处理的任何建议。
思想我可以把所有东西都放到SESSION中,但是这似乎是对资源的巨大浪费。除非有人真的能证明,否则我不认为这是一个解决方案。
我看到过其他问题本质上是问同样的问题,我相信这是不可能真正有效地做你想做的。我个人的看法是,比起仅仅部署SESSION
:
<?php
session_start();
if (!is_array($_SESSION['posted'])) {
$_SESSION['posted'] = array('test'=>'test');
} else {
$_POST = $_SESSION['posted'];
unset($_SESSION['posted']);
}
echo '<pre>';
echo "<strong>POST:</strong>'n";
print_r($_POST);
echo "'n";
echo "<strong>SESSION:</strong>'n";
print_r($_SESSION);
?>
*注意:我的服务器上没有SSL设置,所以我不能具体演示。这是为了演示仅从SESSION
存储的数组中重新填充POST
数组。
http://jfcoder.com/test/postsession.php(刷新查看更改)
所以,如果你可以重建POST
数组这么容易^,为什么不这样做呢?我认为,跨需要和实际使用的请求执行此操作所需的资源可以忽略不计,因为您实际上只需要执行一会儿。
除非您有数十万或数百万的并发点击,否则我无法想象上述问题会成为资源方面的问题。如果是,那就在重定向前处理它。不管怎样,他们已经把数据以明文形式发送了。
^另外,如果你需要的话,你也需要处理文件上传
如果您真的不想做任何服务器端存储,请使用307重定向。应该与任何HTTP/1.1兼容的浏览器工作…但是请注意,您不仅要为POST数据使用两倍的带宽(因为它被发送了两次),而且浏览器在重新提交到新URL之前需要请求许可。
header('HTTP/1.1 307 Temporary Redirect');
header('location: .... );
[edit:]暂时存储在服务器端可能更好。