CakePHP 3 Post 方法“403 禁止”
CakePHP 3 Post Method '403 Forbidden'
我今天遇到了一个非常奇怪的问题,找不到任何解决方案。我正在使用 CakePHP 3 以及 MySQL 和 Apache。直到今天,一切都运行良好,但当我尝试编辑其中一个论坛 post 时,它没有保存,我得到了 403 Forbidden
回复。以下是我得到的回复:
Request URL:https://www.example.com/users/edit/2
Request Method: POST
Status Code:403 Forbidden
奇怪的是,当我尝试创建新论坛 post 以及加载编辑页面时 GET
请求时它工作正常。但是,当我修改字段并尝试保存时,我遇到了 403 Forbidden
。
我在过去 6 小时内尝试了所有方法,但找不到任何解决方案。我检查了数据库用户的编辑权限,试图完全删除 .htaccess
文件,清除浏览器缓存和 cookie,但没有任何帮助。托管帐户中的其他网站工作正常,没有问题。
我今天做的唯一值得注意的事情是我初始化了 GIT
存储库并在 git 上上传了项目文件。非常感谢您帮助解决这个问题。不能修改任何东西真是头疼不已
仅供将来参考,我通过在 $this->Form->create
函数中将请求类型显式定义为 POST
来解决此问题。
这是我在使用 CakePHP 3 时遇到的最奇怪的错误之一!不确定为什么默认 PUT
方法不起作用。它正在转换为 GET
.
呵呵,终于我自己找到了罪魁祸首..这是我得到的解释,给你:
如果您在 cakephp 中使用 csrf 来确保安全,您可能会发现 POST 中的每个该死的 POST、GET、PUT 或表单都会被 cakephp 过滤,如果没有找到 auth,cakephp 会响应具有 403 HTTP 状态..
这意味着您必须在每个请求上放置一些类似于不记名令牌的 csrf 令牌,以便 cakephp 识别该请求。看,如果您正在使用 AJAX 调用,那么您必须在此处手动放置 csrf 令牌:https://book.cakephp.org/3.0/en/controllers/components/csrf.html
如果您手动创建一个表单,您必须将令牌放入表单本身,如果您使用 cakephp 帮助程序创建一个表单,您将看到 cakephp 生成了一些隐藏参数,例如这个
<form enctype="multipart/form-data" method="post" accept-charset="utf-8" action="/SFW/CMS/event/comment">
<div style="display:none;">
<input type="hidden" name="_method" value="POST">
<input type="hidden" name="_csrfToken" autocomplete="off" value="2a39630d2a1c20d43xxxx">
</div>
......
所以选项只是将那些隐藏字段放在您手动生成的表单上。
祝你好运
如果您不关心安全性,您可以在控制器中禁用中间件检查:
public function beforeFilter(Event $event)
{
$this->getEventManager()->off($this->Csrf);
}
参考:
https://book.cakephp.org/3/en/controllers/components/csrf.html
我今天遇到了一个非常奇怪的问题,找不到任何解决方案。我正在使用 CakePHP 3 以及 MySQL 和 Apache。直到今天,一切都运行良好,但当我尝试编辑其中一个论坛 post 时,它没有保存,我得到了 403 Forbidden
回复。以下是我得到的回复:
Request URL:https://www.example.com/users/edit/2
Request Method: POST
Status Code:403 Forbidden
奇怪的是,当我尝试创建新论坛 post 以及加载编辑页面时 GET
请求时它工作正常。但是,当我修改字段并尝试保存时,我遇到了 403 Forbidden
。
我在过去 6 小时内尝试了所有方法,但找不到任何解决方案。我检查了数据库用户的编辑权限,试图完全删除 .htaccess
文件,清除浏览器缓存和 cookie,但没有任何帮助。托管帐户中的其他网站工作正常,没有问题。
我今天做的唯一值得注意的事情是我初始化了 GIT
存储库并在 git 上上传了项目文件。非常感谢您帮助解决这个问题。不能修改任何东西真是头疼不已
仅供将来参考,我通过在 $this->Form->create
函数中将请求类型显式定义为 POST
来解决此问题。
这是我在使用 CakePHP 3 时遇到的最奇怪的错误之一!不确定为什么默认 PUT
方法不起作用。它正在转换为 GET
.
呵呵,终于我自己找到了罪魁祸首..这是我得到的解释,给你:
如果您在 cakephp 中使用 csrf 来确保安全,您可能会发现 POST 中的每个该死的 POST、GET、PUT 或表单都会被 cakephp 过滤,如果没有找到 auth,cakephp 会响应具有 403 HTTP 状态..
这意味着您必须在每个请求上放置一些类似于不记名令牌的 csrf 令牌,以便 cakephp 识别该请求。看,如果您正在使用 AJAX 调用,那么您必须在此处手动放置 csrf 令牌:https://book.cakephp.org/3.0/en/controllers/components/csrf.html
如果您手动创建一个表单,您必须将令牌放入表单本身,如果您使用 cakephp 帮助程序创建一个表单,您将看到 cakephp 生成了一些隐藏参数,例如这个
<form enctype="multipart/form-data" method="post" accept-charset="utf-8" action="/SFW/CMS/event/comment">
<div style="display:none;">
<input type="hidden" name="_method" value="POST">
<input type="hidden" name="_csrfToken" autocomplete="off" value="2a39630d2a1c20d43xxxx">
</div>
......
所以选项只是将那些隐藏字段放在您手动生成的表单上。
祝你好运
如果您不关心安全性,您可以在控制器中禁用中间件检查:
public function beforeFilter(Event $event)
{
$this->getEventManager()->off($this->Csrf);
}
参考: https://book.cakephp.org/3/en/controllers/components/csrf.html