表单发送的是GET而不是POST请求

11

我已经搜索了所有类似标题的问题,但都没有适合我的解决方案。

我有一个运行在 Apache2 上的网站。我需要通过一个表单提交敏感信息,并且我需要使用 POST 方法。但是它却发送了 GET 请求。

HTML:

<form action="/add_user.php" method='POST'>
   Enter Username: <input type="email" name="email" required="required" /> <br/>
   Enter password: <input type="password" name="password" required="required" /> <br/>
   <input type="submit" value="submit"/>
</form>

PHP:

<?php

$email=$_POST['email']; 
$password=$_POST['password'];
//do stuff
?>

我已经在Firefox中打开了网络监视器,并确认该方法是GET。我甚至尝试过将其更改为PUT而不是POST,但仍然发送GET。此外,如果我将$email$password更改为$_GET而不是$_POST,它们将获取值。

任何帮助都将不胜感激。


表单提交时有任何JavaScript吗? - u_mulder
@u_mulder 不,整个页面上没有 JavaScript。 - Mirakurun
这很奇怪,你能否将你的代码上传到服务器上让我们实时测试一下? - Ivan Gabriele
也许你的问题与输入类型submit有关。请参考这个链接:https://dev59.com/pnA65IYBdhLWcg3w9DmF#3543695 - statosdotcom
1
@statosdotcom 感谢您提醒我检查提交按钮,我从未想过它可能是问题所在。我谷歌了一下POST方法的提交按钮,找到了这个:<button type="submit" formmethod="post" formaction="add_user.php">提交</button> 现在终于可以正常工作了。 - Mirakurun
显示剩余8条评论
2个回答

8

解决这个问题的一种方法是通过显式地指定 formmethod="post" 来加强你的意图,就像这样:

<button type="submit" formmethod="post" formaction="add_user.php">Submit</button>

编辑:对于那些学习HTML并有兴趣在SO上互相帮助(因此没有时间哭泣)的人,这里可以找到为什么formmethod是一个真正有效、经过原型和指定的覆盖方法:https://www.w3.org/TR/2014/REC-html5-20141028/forms.html#attr-fs-formmethod


4
我不知道为什么这个被赞了那么多。这只是一种强制措施,而不是解决方案。这就像在 CSS 规则的末尾写上“Important!”一样。最好的方法是解决问题。 - Adam Cook
1
那么还有什么其他的答案呢?以下内容在我们的情况下不适用。 - StackHola

5
如果您和我一样,从路由URL(例如Laravel)转到纯PHP,并且想知道为什么文件/user/store/index.php响应它使用以下方式接收GET请求:
<form method="POST" action="/user/store">
  <input type="text" id="user_name" name="user_name" />
  <button type="submit">Create a new user</button>
</form>

请再检查一遍...是的,您忘记了一个斜杠...所以/user/store只接收get请求,而/user/store/将接收您请求的内容。

编辑

我检查了Laravel的做法,他们在他们的.htaccess文件中添加了以下内容来解决这个问题(请查看原始文件)。

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

我快疯了。谢谢。为什么表单要这样工作? - user4698348
1
显然,从另一个Stackoverflow答案中可以看出,这是由于默认的php服务器(php - S)和Appache的工作方式:如果您请求“/user/store”,它会尝试获取具有此名称的文件,但这不是一个php文件而是一个文件夹。然而,通过添加斜杠,您可以修复此问题,默认情况下将尝试在文件夹中查找index.php,因此它可以正常工作并响应您的路由器。显然,我们可以调整.htaccess文件以告诉Appache始终添加斜杠,但是1.这可能不总是想要的2.我不知道如何使用php - S进行操作... - Anwar
@M.I.Wright,我刚刚添加了一些内容,如果您使用Apache作为服务器,可能会对您有所帮助。不过,我认为PHP内置服务器不会响应此文件。 - Anwar
谢谢!不幸的是,这并不适用于我——当我遇到这个问题时,我正在使用Python/Flask。我定义了没有尾随斜杠的路由,因此没有重定向或其他任何东西,这使得GET而不是POST的行为对我来说真的很令人惊讶。 - user4698348

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接