method="post" enctype="text/plain" 不兼容?
Posted
技术标签:
【中文标题】method="post" enctype="text/plain" 不兼容?【英文标题】:method="post" enctype="text/plain" are not compatible? 【发布时间】:2011-11-29 12:07:58 【问题描述】:当我使用时
<form method="post" enctype="text/plain" action="proc.php">
表单数据无法正确发送到 proc.php 文件。为什么?问题是什么?为什么我不能在 post 中使用 text/plain encoding 但我可以在 get 方法中使用它?
【问题讨论】:
我很确定你不需要定义enctype,除非你正在做文件上传,那么它应该是:enctype="multipart/form-data" link 根据 w3schools (link),application/x-www-form-urlencoded
是默认值。
@Narek 我假设浏览器不知道如何处理它,因为它不是有效的令牌。我敢打赌浏览器将 enctype="text/plain" 视为与 enctype="cheeseburger" 相同,它什么也不做......
实际上,使用method="post" enctype="text/plain"
,浏览器发送数据,PHP 将其存储在$HTTP_RAW_POST_DATA
,但它不会填充$_POST
。不管怎样,你为什么坚持要text/plain
?
我不知道为什么这个问题被关闭了。这是一个很好的问题,已经有了很好的答案。
【参考方案1】:
html5 确实定义了如何格式化提交为text/plain
的表单数据:https://w3c.github.io/html/sec-forms.html#plain-text-form-data。
在该部分的底部,它说:
使用 text/plain 格式的有效负载旨在为人类提供 可读。它们不能被计算机可靠地解释,因为 格式不明确(例如,无法区分 值末尾的换行符中的文字换行符)。
因此,PHP 不尝试解释它并仅以原始形式提供它并不是不合理的。对我来说,这似乎是正确的方法。
【讨论】:
链接断开 - 你可能想要html.spec.whatwg.org/multipage/… @TomAnderson - 谢谢。更新了最新 W3C 草案标准的链接,但是您提供的 WHATWG 是等效的。【参考方案2】:[修订]
答案是,因为 PHP 不处理它(而且它不是错误):
https://bugs.php.net/bug.php?id=33741
Valid values for enctype in <form> tag are:
application/x-www-form-urlencoded
multipart/form-data
第一个是默认的,第二个是上传文件时才需要的。
@Alohci 解释了为什么 PHP 不填充 $_POST
数组,而是将值存储在变量 $HTTP_RAW_POST_DATA
中。
text/plain
enctype 可能出错的示例:
file1.php:
<form method="post" enctype="text/plain" action="file2.php">
<textarea name="input1">abc
input2=def</textarea>
<input name="input2" value="ghi" />
<input type="submit">
</form>
file2.php:
<?php
print($HTTP_RAW_POST_DATA);
?>
结果:
input1=abc
input2=def
input2=ghi
无法区分input1
和input2
变量的值是什么。可以是
abc\r\ninput2=def
, input2=ghi
, 以及
输入1=abc
,输入2=def\r\ninput2=ghi
使用前面提到的其他两种编码时没有这样的问题。
GET 和 POST 的区别:
在 GET 中,变量是 URL 的一部分,并且作为查询字符串出现在 URL 中,因此它们必须进行 URL 编码(即使您写enctype="text/plain"
,它们也是如此 - 它只是被浏览器忽略;您可以使用 Wireshark 嗅探请求数据包进行测试),
发送 POST 时,变量不是 URL 的一部分,而是作为 HTTP 请求(POSTDATA)中的最后一个 header 发送的,您可以选择是发送为text/plain
还是application/x-www-form-urlencoded
,但是第二个是唯一明确的解决方案。
【讨论】:
根据HTML5text/plain
是enctype 的第三个有效内容类型。格式在dev.w3.org/html5/spec/… 中描述。
一张不错的桌子是here(我已经发布了)
坦率地说,我从不相信 w3schools 所说的话。
好吧,这个看起来更可信pseudo-flaw.net/content/web-browsers/form-data-encoding-roundup ;)
$HTTP_RAW_POST_DATA
在 PHP 5.6 中已弃用,并在 PHP 7.0 中删除。以上是关于method="post" enctype="text/plain" 不兼容?的主要内容,如果未能解决你的问题,请参考以下文章
method="post" enctype="text/plain" 不兼容?
<form action="result.jsp" method="post">中的后面的action、method中的引号填啥?
form method="post" 阻止了我的 Meta 刷新
405 Method not Allow, methods=["POST", "GET"] 不工作
我正在尝试从 post 方法获取令牌,但我得到 json 响应 "Get/Method?Not Allowed" 我为此使用 POST 方法