MALOUDA-PSA 2024-04-27 13:40 采纳率: 90.9%
浏览 3

nginx 405 错误


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>Jay Skript And The Domsters: Contact the band</title>
  <script src="scripts/modernizr-1.6.min.js"></script>
  <link rel="stylesheet" media="screen" href="styles/basic.css" />
</head>
<body>
  <header>
    <img src="images/logo.gif" alt="Jay Skript and the Domsters" />
    <nav>
      <ul>
        <li><a href="i.html">Home</a></li>
        <li><a href="c.html">Contact</a></li>
      </ul>
    </nav>
  </header>
  <article>
    <h1>Thanks!</h1>
    <p>Thanks for contacting us. We'll get back to you as soon as we can.</p>
  </article>
  <script src="scripts/global.js"></script>
</body>
</html>

上面是submit.html 内容, 执行js后成了:

<html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.8.1</center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->


js:

function prepareForms() {
  for (var i=0; i<document.forms.length; i++) {
    var thisform = document.forms[i];
    resetFields(thisform);
    thisform.onsubmit = function() {
      if (!validateForm(this)) return false;
      var article = document.getElementsByTagName('article')[0];
      if (submitFormWithAjax(this, article)) return false;
      return true;
    }
  }
}

function submitFormWithAjax( whichform, thetarget ) {

  var request = getHTTPObject();
  if (!request) { return false; }

  // Display a loading message.
  displayAjaxLoading(thetarget);

  // Collect the data.
  var dataParts = [];
  var element;
  for (var i=0; i<whichform.elements.length; i++) {
    element = whichform.elements[i];
    dataParts[i] = element.name + '=' + encodeURIComponent(element.value);
  }
  var data = dataParts.join('&');

  request.open('POST', whichform.getAttribute("action"), true);
  request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

  request.onreadystatechange = function () {
    if (request.readyState == 4) {
        if (request.status == 200 || request.status == 0) {
            alert(request.responseText);
          thetarget.innerHTML = '<p>iiiiiii--' + request.statusText + '</p>';
          /*var matches = request.responseText.match(/<article>([\s\S]+)<\/article>/);
          if (matches.length > 0) {
            thetarget.innerHTML = matches[1];
          } else {
            thetarget.innerHTML = '<p>Oops, there was an error. Sorry.</p>';
          }
        } else {
          thetarget.innerHTML = '<p>iiiiiii--' + request.statusText + '</p>';
        }*/
    }
  };

    alert(data);

  request.send(data);

  return true;
};

是不是跨域了? 哪里的问题?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-27 13:40
    关注

    引自免费微信小程序:皆我百晓生

    看起来您在使用JavaScript提交一个表单,并且使用AJAX技术通过POST方法发送数据到服务器。但是当您尝试执行此操作时,收到了一个405 Not Allowed错误。这个错误通常表示服务器不接受您请求的方法(在这种情况下是POST)。这可能是由于几个原因,包括但不限于:

    1. 跨域资源共享(CORS):如果您的前端页面与处理表单提交的服务器不在同一个域名下,那么可能需要启用CORS。
    2. 服务器配置:Nginx服务器可能没有正确配置来接受POST请求。
    3. PHP或其他后端脚本:如果您有一个接收POST数据的PHP文件或者其他后端脚本,它可能有错误,导致服务器拒绝请求。

    首先,检查一下以下几个方面:

    1. CORS

    确保服务器允许从任何源进行跨域请求,或者至少允许来自您的前端页面的特定源。在Nginx配置文件中添加适当的CORS头。例如,在nginx.conf或相应的虚拟主机配置中添加以下内容:

    location / {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    
        # 如果有其他需要处理POST请求的路径,可以指定具体的路径
        # location /your_post_endpoint {
        #     ...
        # }
    }
    

    2. Nginx 配置

    确认Nginx配置是否正确处理POST请求。默认情况下,Nginx应该能处理POST请求,但有时可能因为某些原因被禁用。检查您的Nginx配置,确保没有意外地禁止POST请求。

    3. 后端脚本

    检查处理POST请求的后端脚本(例如PHP)是否存在语法错误或逻辑错误,这可能导致服务器返回405状态码。

    如果以上都没有问题,您可以考虑以下调试步骤:

    • 检查浏览器开发者工具中的网络面板,查看详细的请求和响应信息,特别是响应头,可能会提供关于错误更具体的原因。
    • 确保表单的ACTION属性指向正确的URL,且该URL可以正确处理POST请求。
    • 检查您的JavaScript代码,确保所有的变量都已正确定义,没有拼写错误,以及请求设置是否正确。

    对于您的JavaScript代码,这里有一些改进点:

    1. 使用FormData对象替代手动构建data字符串,这样可以更好地处理表单数据。
    2. 使用fetch API代替XMLHttpRequest,因为它提供了更好的错误处理和API设计。

    以下是修改后的JavaScript代码:

    function prepareForms() {
      for (var i = 0; i < document.forms.length; i++) {
        var thisform = document.forms[i];
        resetFields(thisform);
        thisform.addEventListener('submit', function (event) {
          event.preventDefault(); // 阻止默认提交行为
          if (!validateForm(this)) return;
    
          const formData = new FormData(event.target);
          const target = document.getElementsByTagName('article')[0];
    
          submitFormWithAjax(formData, target).then(response => {
            if (response.ok) {
              target.innerHTML = `<p>Thank you! Your message has been sent.</p>`;
            } else {
              target.innerHTML = `<p>Error sending the form. Please try again later.</p>`;
            }
          }).catch(error => {
            console.error('Error:', error);
            target.innerHTML = `<p>Error sending the form. Please try again later.</p>`;
          });
        });
      }
    }
    
    async function submitFormWithAjax(formData, target) {
      try {
        const response = await fetch(thisform.getAttribute("action"), {
          method: 'POST',
          body: formData,
          headers: {
            'Content-Type': 'multipart/form-data'
          },
        });
    
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
    
        return response.text();
      } catch (error) {
        return Promise.reject(error);
      }
    }
    

    将这段代码替换您现有的JavaScript代码,然后重新测试。如果还有问题,请检查服务器日志,它可能会提供有关发生错误的更多信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月27日

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 深度学习残差模块模型
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用
  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)