質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

特定のアクションでJavaScript ajaxのアクセスが404になってしまう

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 875

score 43

前提・実現したいこと

・Cakephp3
・Amazon EC2

リアルタイムに情報を更新するページを作成しています。
AjaxでcakephpのアクションのURLを指定し、DB処理を行います。

何かしらの変更後(どこが原因かわかりません。記憶を頼りに出来る限り戻しましたが治りませんでした)から(update-holiday)アクションで404になってしまいます。
変更前は期待通りの動作をしていました。

エラーが出る前に変更した点

jsに追加

$('#description'+id).prop('disabled', false);


アクションに追加

$holiday->description = $this->request->data('description');

また、php.iniにてファイルのMAXアップロード容量を100Mまで引き上げました。

発生している問題・エラーメッセージ

POST 404エラー

ChromeConsole

POST https://XXX/update-holiday 404 ()
edit_holiday.js:103 XMLHttpRequest : 404
edit_holiday.js:104 textStatus : error
edit_holiday.js:105 errorThrown : 

EC2、Apacheのaccess_log

172.31.13.0 - - [13/Jul/2017:10:23:22 +0900] "POST XXX/update-client HTTP/1.1" 404 211287 "XXX/setting" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"

該当のソースコード

('.ok').click(function(){
    id = $(this).val();

    $('#ok'+id).prop('disabled', true);
    $('#stop'+id).prop('disabled', true);

    $('#description'+id).prop('disabled', true);
    $('#start-date'+id).prop('disabled', true);
    $('#start-time'+id).prop('disabled', true);
    $('#end-date'+id).prop('disabled', true);
    $('#end-time'+id).prop('disabled', true);

    $.ajax({
      type: 'POST',
      url: 'https://XXX/update-holiday',
      data: {
        id: parseInt($('#id'+id).text()),
        description: $('#description'+id).val(),
        start_date: $('#start-date'+id).val(),
        start_time: $('#start-time'+id).val(),
        end_date: $('#end-date'+id).val(),
        end_time: $('#end-time'+id).val(),
        deleted: 0,
      }
    }).done(function(data, textStatus, jqXHR){
      $('#edit'+id).show();
      $('#delete'+id).show();
      $('#ok'+id).hide();
      $('#stop'+id).hide();

      $('#ok'+id).prop('disabled', false);
      $('#stop'+id).prop('disabled', false);

      $('tr#tr'+id).removeClass('info');
    }).fail(function(jqXHR, textStatus, errorThrown){
      console.log("XMLHttpRequest : " + jqXHR.status);
      console.log("textStatus : " + textStatus);
      console.log("errorThrown : " + errorThrown);

      $('#ok'+id).prop('disabled', false);
      $('#stop'+id).prop('disabled', false);

      $('#description'+id).prop('disabled', false);
      $('#start-date'+id).prop('disabled', false);
      $('#start-time'+id).prop('disabled', false);
      $('#end-date'+id).prop('disabled', false);
      $('#end-time'+id).prop('disabled', false);
    });
  });

試したこと

  • ほぼ同じコード(HTMLのid等を変更)の別のアクション(update-client)にあるjsでは正常にアクセスできています。
  • (update-client)のjsのURLを(update-holiday)にすると404になりません(つまりURLはあっている)。
  • 正常に動作している、(update-client)のjsのファイルをコピーして(update-holiday)のページで動作させると同じく404エラーになります。
  • エラーが出る前に変更した点をコメントアウト(php.iniはもとの数値を覚えていません)

補足

  • jsファイルのアクセス権限はともに-rw-r--r--です。
  • どちらのアクション(update-client)、(update-holiday)でも
$this->viewBuilder()->layout('');
$this->autoRender = false;


を宣言しており、ctpファイル(空)のアクセス権限はともに-rw-r--r--です。

原因や怪しい点などございましたらご教示願います。

追記

logs/debug.log

2017-07-13 12:21:59 Debug: duration=0 rows=0 SELECT Holidays.id AS `Holidays__id`, Holidays.description AS `Holidays__description`, Holidays.start_date AS `Holidays__start_date`, Holidays.start_time AS `Holidays__start_time`, Holidays.end_date AS `Holidays__end_date`, Holidays.end_time AS `Holidays__end_time`, Holidays.deleted AS `Holidays__deleted` FROM holidays Holidays WHERE Holidays.id = 0 LIMIT 1
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • popobot

    2017/07/13 12:10

    CakePHPが404を出しているならどこかでNotFoundExceptionをスローしていると思います。logs配下のエラー等記録されていないか確認してみてください。

    キャンセル

  • massy7

    2017/07/13 12:13

    「/var/log/httpd/error_log」には何も出てこないので、cakephpは関係ないのものだと思っています

    キャンセル

  • popobot

    2017/07/13 12:14

    Apacheではなく、CakePHPのログを見てみてください。

    キャンセル

  • massy7

    2017/07/13 12:25

    error.logには実行時に何も出てきませんでした。debug.logにはDBアクセスされたようなログが出てきました。追記します。

    キャンセル

回答 1

checkベストアンサー

+2

あくまで推測ですが...
debug.logのSQLをよく見ると
最初の方にrows=0と書かれており、結果が0件になっていますね。このSQLがどのようなコードから発行されたか記載がないのですが、多分get()かfirstOrFail()などが使われており、結果がみつからなかったので、RecordNotFoundExceptionがスローされて404になったのではないかと推測します。

最後の方のwhere句でWHERE Holidays.id = 0となっているので、js側から渡されたidが正しくSQLに設定されていないのが原因ではないかと思います。もしくはjs側がhtmlから正しくidを取れていないか...

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/13 12:48 編集

    htmlでidの表示をやめていたことが原因で、idに値が入っておりませんでした。
    変更直後にしっかり確認したいと思います。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る