ホームページ  >  記事  >  PHPフレームワーク  >  thinkPHP5 送信フォームのエラー報告の理由と解決策の分析

thinkPHP5 送信フォームのエラー報告の理由と解決策の分析

PHPz
PHPzオリジナル
2023-04-11 16:10:531059ブラウズ

ThinkPHP5 は、PHP をベースにしたオープンソースの Web アプリケーション フレームワークで、その設計コンセプトはシンプル、直感的、柔軟です。ただし、ThinkPHP5 フレームワークを使用して開発する場合、いくつかの問題やエラーが発生する可能性があります。その中でもフォーム送信時のエラーはよくあるトラブルの一つです。この記事では、ThinkPHP5の送信フォームでエラーが発生する原因と解決策を紹介します。

1. エラーの原因

ThinkPHP5 では、post メソッドを使用してフォーム データを送信することも、put や delete などの他のメソッドを使用することもできます。ただし、フォーム データを送信するときに、次の図に示すように、「この HTTP メソッドは送信できません」というエラー メッセージが表示されることがあります。

このエラー メッセージが表示される理由は、ブラウザが「OPTIONS」と呼ばれる事前チェック メカニズムを使用しているためです。 POST や PUT などの単純でないリクエスト メソッドを使用してデータを送信する場合、ブラウザはまず OPTIONS リクエストを送信して、サーバーがこのリクエスト メソッドをサポートしているかどうかを判断します。サーバーがサポートしていない場合、上記のエラーメッセージが表示されます。

2. 解決策

  1. クロスドメイン サポートを有効にする

まず、クロスドメインとは何かを理解します。クロスドメインとは、あるドメイン名の JavaScript コードを別のドメイン名の Web ページ上で実行することを指します。厳密に言えば、プロトコル、ドメイン名、ポートが異なる限り、それらはすべて別のドメインとみなされ、クロスドメインの問題が発生します。フォーム データを送信するときに、クロスドメインの問題が原因で上記のエラーが発生する場合があります。

解決策は、サーバー側でクロスドメインのサポートを有効にすることです。 ThinkPHP5 では、構成ファイル config.php に次のコードを追加できます。

// 开启跨域支持
'cross_domain'   => [
    'allow_origin' => ['*'],
    'allow_methods' => ['POST','GET','OPTIONS','PUT','DELETE'],
    'allow_headers' => ['*'],
    'expose_headers'=> ['token'],
    'max_age'       => 3600,
    'allow_credentials' => true,
],

このうち、allow_origin パラメーターは許可されるドメイン名を指定します。 はすべてのドメイン名が許可されることを意味します。 allow_methods パラメータは、許可されるリクエスト メソッドを指定します。PUT や DELETE などの単純でないリクエスト メソッドも追加する必要があります。 allow_headers パラメーターは、許可されるリクエスト ヘッダー情報を指定します。 は、任意のリクエスト ヘッダーを受け入れることを意味します。 Expose_headers パラメーターはユーザーが取得できる追加情報を指定し、token はトークン情報の取得が許可されることを示します。 max_age パラメータは、キャッシュに許可される時間を秒単位で指定します。 allow_credentials パラメーターは、Cookie などの ID 資格情報の使用が許可されることを示します。

  1. リクエスト メソッドを変更する

クロスドメイン サポートを有効にしたくない場合は、リクエスト メソッドを変更することで問題を解決することもできます。フォーム データを送信するときに、ブラウザーの事前チェックの問題を回避するために、リクエスト メソッドを POST に変更できます。

HTML では、次のようにフォームのメソッド属性を変更できます:

<form method="POST">

JavaScript では、次のように ajax リクエストの type 属性を変更できます:

$.ajax({
    type: 'POST',
    url: 'http://example.com/path/to/api',
    data: postData,
    success: function(data) {
        console.log(data);
    }
});
  1. nginx 構成の変更

Nginx を Web サーバーとして使用しているときに上記のエラーが発生した場合は、次の構成を nginx.conf ファイルに追加できます:

location / {
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,token';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
    }
    ...
}

Among Access-Control-Allow-Origin 、 Access-Control-Allow-Methods、 Access-Control-Allow-Headers、 Access-Control-Max-Age およびその他のパラメーターは、上で説明したものと同じ意味を持ちます。

概要

フォーム データ送信時のエラーはよくある問題ですが、初心者にとっては解決するのが難しい場合があります。この記事では、読者が ThinkPHP5 フレームワークをより良く使用できるように、フォーム送信時のエラーの理由と解決策を紹介します。

以上がthinkPHP5 送信フォームのエラー報告の理由と解決策の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。