【问题标题】:amazon aws 405 method not allowed when submitting form提交表单时不允许使用 amazon aws 405 方法
【发布时间】:2015-07-13 14:17:24
【问题描述】:

最近我开始使用亚马逊的 AWS 进行网络托管,但我的 HTML 联系表单似乎不再起作用,单击提交按钮时返回此错误。

<html> <head><title>405 Method Not Allowed</title></head> <body> <h1>405 Method Not Allowed</h1> <ul> <li>Code: MethodNotAllowed</li> <li>Message: The specified method is not allowed against this resource.</li> <li>Method: POST</li> <li>ResourceType: OBJECT</li> <li>RequestId: A8750F9D0586C1E5</li> <li>HostId: FHjhs//WnJVj8GLE/hKVzkaIBq9DRuhNJxObJ8eARsvAbURpWS87tWivbIsCGnzAeFne9lLLvNI=</li> </ul> <hr/> </body> </html>

我的html:

<div class="email-form">
    <form id="ajax-contact" method="post" action="mailer.php">
        <div class="flex-input-wrap">
            <input type="text" placeholder="Name" name="name" id="name" class="flex-input-1" required="">
            <input type="email" placeholder="Email" name="email" id="email" class="flex-input-2" required="">
        </div>
        <textarea type="text" placeholder="Enter text" name="message" id="message" required=""></textarea>
        <button type="submit" class="submit-button">Send message</button>
    </form>
    <div id="form-messages"></div>
</div>

js:

$(function () {
    var e = $("#ajax-contact"),
        a = $("#form-messages");
    $(e).submit(function (s) {
        s.preventDefault();
        var r = $(e).serialize();
        $.ajax({
            type: "POST",
            url: $(e).attr("action"),
            data: r
        }).done(function (e) {
            $(a).removeClass("error"), $(a).addClass("success"), $(a).text(e), $("#name").val(""), $("#email").val(""), $("#message").val("")
        }).fail(function (e) {
            $(a).removeClass("success"), $(a).addClass("error"), $(a).text("" !== e.responseText ? e.responseText : "Oops! An error occured and your message could not be sent.")
        })
    })
});

mailer.php 文件:

<?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $name = strip_tags(trim($_POST["name"]));
        $name = str_replace(array("\r","\n"),array(" "," "),$name);
        $email = filter_var(trim($_POST["email"]), FILTER_SANITIZE_EMAIL);
        $message = trim($_POST["message"]);
        if ( empty($name) OR empty($message) OR !filter_var($email, FILTER_VALIDATE_EMAIL)) {
            http_response_code(400);
            echo "Oops! Did you forget to fill out something? Try again.";
            exit;
        }
        $recipient = "myemail@gmail.com";
        $subject = "New email from $name";
        $email_content = "Name: $name\n";
        $email_content .= "Email: $email\n\n";
        $email_content .= "Message:\n$message\n";
        $email_headers = "From: $name <$email>";
        if (mail($recipient, $subject, $email_content, $email_headers)) {
            http_response_code(200);
            echo "Thanks! Your message was sent.";
        } else {
            http_response_code(500);
            echo "Oops! Something went wrong and your message couldn't be sent.";
        }
    } else {
        http_response_code(403);
        echo "There was a problem with your message, please try again.";
    }
?>

我在 AWS 中是否缺少某种类型的设置?

提前致谢。

【问题讨论】:

    标签: php amazon-web-services amazon-s3


    【解决方案1】:

    猜测您已将 index.html 静态托管在 S3 中,而 POST 实际上会发送到 S3,后者会拒绝它,而不是发送到您的 PHP 服务器。

    【讨论】:

    • 我明白了!我需要为 PHP 安装 AWS 开发工具包吗? aws.amazon.com/sdk-for-php
    • @xenerr 如果我的猜测是正确的(是吗?),那么您现在的问题是网页是从 S3 加载的,因此表单提交会返回到 S3。您可能应该让您的服务器而不是 S3 提供网页,然后表单提交将返回到您的服务器。或者您可以坚持使用 S3 并尝试使用 XHR 或服务器上的 CORS 强制表单提交到您的服务器。
    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2012-06-29
    相关资源
    最近更新 更多