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",