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