405 Ajax POST 错误

Posted

技术标签:

【中文标题】405 Ajax POST 错误【英文标题】:405 Ajax POST error 【发布时间】:2019-01-24 12:14:35 【问题描述】:

所以基本上我的主 html 页面有 3 个按钮,每个按钮都有一个不同的背景图像链接到它。我正在尝试通过 ajax 帖子将此图像的来源传递到我的 php 文件以写入 txt 文件。

我的 JS:

// MAIN
$(function() 

$(".artButton").click(function()
    var artId = $(this).attr("id");
    var source = $("#"+artId).css("background-image").replace(/^url\(['"](.+)['"]\)/, '$1');


    // DEBUG
    console.log(source) //example: http://localhost/crowd.jpg
    console.log(typeof source)//example: string


$.ajax(  
            type: 'POST',  
            url: 'writeToTxt.php', 
            data: source,
            success: function(response) 
            console.log("Succes");
    
);
);
);

我的 PHP 文件:

<?php


$my_file = 'toExpose.txt';
$handle = fopen($my_file, 'w') or die('Cannot open file:  '.$my_file);
$data = $_POST['data'];
fwrite($handle, $data);

?>

导致 chrome 控制台出现以下错误: 405 Ajax Post error

请注意,我不是编程专家...更多关于“我需要一些东西,所以我正在尝试自己编写代码”-spectrum。就编码而言,其中很多可能不是最佳实践,但我只需要它按预期工作! 非常感谢您的帮助!

注意:一切都在本地主机上运行

更新: 这是页面的 HTML:

<html>

<link href="style.css" rel="stylesheet" type="text/css"/>
 <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">


<body>
<header class="navbar">
<div class="container">

<h1>Welcome to oneFRAME</h1>

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">

  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item">
        <a class="nav-link" href="Home.html">Home <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item active">
        <a class="nav-link" href="#">Library</a>
      </li>

      <li class="nav-item">
        <a class="nav-link" href="LibraryV2.html">Library v2</a>
      </li>

      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Dropdown
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
          <a class="dropdown-item" href="#">About</a>
          <div class="dropdown-divider"></div>
          <a class="dropdown-item" href="#">Contact</a>
        </div>
      </li>

    </ul>
    <form class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
    </form>
  </div>
</nav>
</div>
</header>



    <button id="choice1" class="artButton" type="button">Nature</button>
    <button id="choice2" class="artButton" type="button">Art</button>
    <button id="choice3" class="artButton" type="button">Crowd</button>


<script src="jquery-3.3.1.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<script src="main_temp.js"></script>

</body>

</html>

【问题讨论】:

是 laravel 吗?? 请检查“toExpose.txt”文件的权限。 HTTP 405 错误表明您的脚本和/或 Web 服务器存在问题。该错误意味着您正在尝试传回一个文件,该文件在服务器上没有必要的权限来接收来自另一个脚本的 Post 信息。 你在使用 ubantu 吗? 您的网络服务器权限是什么。在目录上发出 ls -lh 并将权限发送给我们。您可能需要对目录和文件发出 chown 和 chmod。 您的问题缺少信息,例如是否存在框架? 【参考方案1】:

您收到错误消息,因为您在 htdocs 或 www 目录中没有写入权限。

使用sudo chmod -R 777 /directory更改文件夹权限 将您的 ajax 方法 POST 更改为 GET(有时无法使用)。

不确定,但我怀疑你的路径一定是http://localhost/example/index.php

更新代码:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="jquery.min.js"></script>

</head>
<body>

    <button id="choice1" class="artButton" type="button" style="background-image:url('http://localhost/Veridocglobalportal2/veridocedu/public/img/edu-logo.png');">Nature</button>
    <button id="choice2" class="artButton" type="button">Art</button>
    <button id="choice3" class="artButton" type="button">Crowd</button>
    <script type="text/javascript">
        // MAIN
$(function() 

$(".artButton").click(function()
    var artId = $(this).attr("id");
     var source = $("#"+artId);
switch (artId) 
    case "choice1":
        var source = "http://localhost/crowd.jpg";
        break;
    case "choice2":
        var source = "http://localhost/people.jpg";
        break;
    case "choice3":
        var source = "http://localhost/alone.jpg";
        break;
 


// DEBUG
console.log(source) //example: http://localhost/crowd.jpg
console.log(typeof source)//example: string

$.ajax(  
            type: 'POST',  
            url: 'writeToTxt.php', 
            data: "data":source,
            success: function(response) 
            console.log("Succes");
    
);
);
);
    </script>

</body>
</html>

writeTotxt.php

   <?php
$cwd=getcwd();
$data = $_POST['data'];
$myfile = file_put_contents("$cwd/logs.txt", $data.PHP_EOL,FILE_APPEND | LOCK_EX );

【讨论】:

我把php的url改成了localhost/writeToTxt.php。但我仍然收到 405 错误。关于权限,当我在 Windows localhost 上工作时,我已经更改了文件夹的权限,其中我的所有文件都允许所有更改。 文件是否在该位置可用? @Stas06 artButton 是按钮还是图片? var source = $("#"+artId).css("background-image").replace(/^url(['"](.+)['"])/, '$1​​');路径是什么? artButton 是我给按钮使用的一个类 .this 在 js 中【参考方案2】:

试试这个

$(function() 

$(".artButton").click(function()
  var artId = $(this).attr("id");
  var source = $("#"+artId).css("background-image").replace(/^url\(['"](.+)['"]\)/, '$1');


// DEBUG
console.log(source) //example: http://localhost/crowd.jpg
console.log(typeof source)//example: string


$.ajax(  
        type: 'POST',  
        url: 'writeToTxt.php', 
        data: source:source,
        success: function(response) 
          console.log("Succes");
        
     );
  );
);

【讨论】:

jQuery 代码似乎正确,您需要检查服务器文件设置。在查看允许方法验证后,首先检查 writeToTxt.php 权限。在这里找到en.wikipedia.org/wiki/List_of_HTTP_status_codes#405【参考方案3】:

尝试在对象中传递数据,例如

$.ajax(  
            type: 'POST',  
            url: 'writeToTxt.php', 
            data: data: source,
            success: function(response) 
            console.log("Succes");
    

【讨论】:

【参考方案4】:

您收到客户端错误。 4.x.x 都是关于客户端错误的。

像这样更改您的 ajax 请求 -

$.ajax(  
                type: 'POST',  
                url: 'writeToTxt.php', 
                data: 'name=xxx&address=xxxx',
                success: function(response) 
                console.log("Succes");
        
    );

用您的帖子数据替换“name=xxx&address=xxxx”。

在 PHP 中像这样使用 - $name = $_POST['name']; $adress = $_POST['地址'];

【讨论】:

【参考方案5】:

HTTP 405 错误表明您的脚本和/或网络服务器存在问题。该错误表示您正在尝试传回一个文件,该文件在服务器上没有必要的权限来接收来自另一个脚本的 Post 信息。

【讨论】:

刚刚添加作为注释,所有内容都在本地主机上运行。 txt 文件到现在还不存在,因为我认为 php 会创建一个它完全通过的文件

以上是关于405 Ajax POST 错误的主要内容,如果未能解决你的问题,请参考以下文章

Ajax POST / Nginx 配置出现 405 错误

Django - 使用 Ajax 的 POST 方法错误“POST /......./ HTTP/1.1”405 0

Ajax POST 到 WCF Rest CORS 兼容的 WebService 引发错误 405

为啥来自 Vuejs 的 Laravel 8 的 AJAX POST 请求会引发 405(不支持的方法)错误?

来自 .net WCF 服务的 405 响应错误

带有ajax jQuery的405(不允许方法)(POST)方法