LoginSignup
2
3

More than 3 years have passed since last update.

Ajax通信で403エラーになる

Last updated at Posted at 2019-11-26

Ajax通信が403エラーで返ってきていた原因の調査にとても時間を取られたので、備忘録として残します。

環境

  • php: 7.1.30
  • Laravel: 5.4.36
  • Webサーバー: Apache 2.4

返ってきていたエラー

Ajaxでデータを更新するフォームで、送信したのにうまく更新されていない
->Laravelのログを見てみる
->ログには何も出ていない
->Chromeのコンソールで確認した結果、以下のエラーが返ってきていました。

PUT https://xxx/yyy/zzz 403 (Forbidden)

Ajax通信が403エラーでうまく動作していません。なぜかアクセス禁止の扱いを受けてしまっています。

調査

  • Apacheのエラーログの確認

Laravelのログに何も出ていない->そこまで処理が来ていないということなので、Apacheのエラーログを確認することにしました。(ここまでに結構な時間がかかってしまいました)

Apacheのエラーログを確認すると、以下のエラーが出ていました。

[Thu Nov 21 19:42:57.735794 2019] [authz_core:error] [pid 22270] [client xx.yyy.zzz.nn:12345] AH01630: client denied by server configuration: /home/xxx/public_html/public/xxxxxx, referer: https://xxx/yyy/zzz

とりあえず

AH01630: client denied by server configuration

のエラー文言で検索してみるも、"アクセス制限の記述方法がApache2.2と2.4で変わっている"系の記事ばかりで、解決に繋がるようなめぼしい情報は見つかりませんでした。
とりあえずApacheの設定をどこか変更するのだろうと、闇雲に設定ファイルの中を覗き回っているうちに、1日が終わってしまいました。


ところで、最初にChromeのコンソールで確認したエラー文言は

  • PUTで送信して403のエラー

というものでした。
もしかしてPUTメソッドが禁止されているのでは??
と自分で思いついたわけではなくヒントをいただいたので、該当箇所を確認することに。

 /etc/httpd/conf.d/userdir.conf

<Directory "/home/*/public_html">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

↓これ

Require method GET POST OPTIONS

PUTは許可されていませんでした。

解決

PUTではなくPOSTを使えばいいということがわかったので、Apacheの設定を変更せずともエラーを解消することができました。

  • ルーティングのメソッド変更
Route::put('/xx/{xxx}/xx/{xxx}', 'SomethingApiController@somethingUpdate')

Route::post('/xx/{xxx}/xx/{xxx}', 'SomethingApiController@somethingUpdate')

  • Ajax時のメソッド変更
type: "PUT",

type: "POST",
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3