Php 阻止用户在未首先完成表单的情况下访问提交页面

Php 阻止用户在未首先完成表单的情况下访问提交页面,php,Php,假设我在example.com/contact上有一个表单,它在example.com/submitted上处理。理论上,任何人目前都可以直接访问example.com/submitted,尽管这并不理想,因为会显示消息。7年前有个问题,但里面的答案不起作用 理论上,表单页面的内容并不重要,只要它是发布的。我不想重复提交页面的内容,因为它是完整的。我只需要一些简单的东西,比如如果推荐人不是example.com/form或POST方法 我只需要在用户实际提交了内容时才允许访问example.co

假设我在
example.com/contact
上有一个表单,它在
example.com/submitted
上处理。理论上,任何人目前都可以直接访问
example.com/submitted
,尽管这并不理想,因为会显示消息。7年前有个问题,但里面的答案不起作用

理论上,表单页面的内容并不重要,只要它是发布的。我不想重复提交页面的内容,因为它是完整的。我只需要一些简单的东西,比如如果推荐人不是
example.com/form
POST
方法

我只需要在用户实际提交了内容时才允许访问
example.com/submitted
。我尝试过PHP和htaccess方法(首选PHP),但没有发现任何有效的方法。在同一页面上处理将删除此问题,但提交的页面包含完全不同的内容


如果您有任何建议,我将不胜感激,因为我在任何地方都找不到有效的答案。

您可以通过这样做来完成对参考者和请求方法的检查:

if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SERVER['HTTP_REFERER'] == "http://example.com/form") {
    // Your code
}
试试这个: contact.php

session_start();
...
$_SESSION['form-submitted'] = 0;
if(isset($_POST['submit'])){//use your button value
   //do your stuff
   $_SESSION['form-submitted'] = 1;
   //redirect to submitted file
}
if(isset($_SESSION['form-submitted']) && $_SESSION['form-submitted'] == 1){
   //show content
} else {
   //redirect to contact page
}
submitted.php

session_start();
...
$_SESSION['form-submitted'] = 0;
if(isset($_POST['submit'])){//use your button value
   //do your stuff
   $_SESSION['form-submitted'] = 1;
   //redirect to submitted file
}
if(isset($_SESSION['form-submitted']) && $_SESSION['form-submitted'] == 1){
   //show content
} else {
   //redirect to contact page
}

这将允许您捕获get请求并检查表单是否未提交

你试过这个了吗

if (!isset($_POST)) {
    header("Location: http://example.com/contact");
}

example.com/contact
上表单的
操作
指向
example.org/submitted
,以便表单内容发布到您的
submitted
页面

然后,在您的
提交
页面上,检查方法,并重定向到
获取
上的
联系人
(或者更好,所有不属于
发布
):


不幸的是,这不起作用。它甚至不需要检查两者。理论上,它可以检查它是否来自表单页面,如果不是,则将用户发送到表单处理代码的顶部。我想知道,如果直接访问逗号,最好的方法是隐藏逗号,而不是试图阻止它。你可以在提交页面中“包括”/“要求”成功页面,这样只有在收到帖子数据后才会显示其内容,这样,您就可以保持在同一个URL上,并且只有在处理表单后才会显示该文件。我试图避开会话,因为它们在绝大多数使用中都不需要,并且可以减少计算使用。我更倾向于在没有
,name
的情况下直接访问感谢信息。您也可以尝试使用特殊编码的get参数重定向,并在提交页面上检查它们。您如何将表单提交保存到服务器端?它们正在发布到CSV。是的,出于某种原因,这是行不通的,而且确实应该这样做。这是我的第一次尝试,应该也可以,但是直接访问
example.com/submitted
仍然是可能的。标题替换没有发生。@learningtoanimate这是您周围代码的一个问题。如果你作为MCVE这样做,你会看到它是有效的。如果没有看到其他代码,就无法解释为什么它不适合您。明白了,谢谢您发布一个有效的解决方案。我只需要把它放在文档的最顶端。@learningtoanimate
header()
需要在输出之前完成。在写入任何输出之前,不一定要在顶部。