2011-03-03 6 views
3

Kohana 3ルートやルートが失敗する原因となる、非常に迷惑な問題が発生しています。kohana 3ルーティングが特定の状況で失敗する

問題のルートは次のように定義される:/カレンダー/を保存:

Route::set('module', '(<lang>/)<controller>(/<action>(/<id>))', array('lang' => $lang_options, 'controller' => '(docrepo|calendar|maps|forum)')) 
->defaults(array(
     'controller' => 'docrepo', 
     'lang' => DEFAULT_LANG, 
     'action' => 'index', 
)); 
  • このルートは私の問題を引き起こしている特定のケースがあり、ほぼすべてのケース
  • のために正常に動作しているようです/カレンダーは/ SafariやIE のタブから直接ルートを保存するアクセス
  • は常に(例えばhttps://my.site.com/calendar/save
  • 作品Firefoxのタブから直接/ calendar/saveルートにアクセスすると、が動作することがあります。(例: /カレンダーへのアクセスhttps://my.site.com/calendar/save
  • /常にを失敗し任意のブラウザでAJAXからのルートを保存し、ページが私のキャッチすべてのルートでキャッチし、404ページに送られてしまう、キャッチオールルートは
  • の下に示されています同じコントローラとルート常に(でもAJAX経由)作品のために別のアクションにアクセス
  • (例えばすべてのブラウザで直接、またはAJAXを経由して正常に動作しますhttps://my.site.com/calendar/edit

キャッチすべてのルートがある:

Route::set('catch_all', '<path>', array('path' => '(|.+)')) 
->defaults(array(
    'controller' => 'base', 
    'action' => '404', 
)); 

Apacheのログにはエラーはありません。すべてがApacheとPHPごとに動作しているからです。

私のKohanaログにはエラーはありません。すべてがKohanaに従って動作しているからです。

私は私の404ページにいくつかのデバッグコードを追加し、ここにカレンダーへのAJAX呼び出しからの出力/保存される:ここで

The requested URI was not found: 

calender/save 

The requested URL was not found: 

https://my.website.com/calender/save 

Here is the request data: 

object Request(19) { 
    protected _requested_with => NULL 
    protected _method => string(4) "POST" 
    protected _protocol => string(5) "https" 
    protected _referrer => NULL 
    protected _route => object Route(5) { 
     protected _callback => NULL 
     protected _uri => string(6) "<path>" 
     protected _regex => array(1) (
      "path" => string(5) "(|.+)" 
     ) 
     protected _defaults => array(2) (
      "controller" => string(4) "base" 
      "action" => string(3) "404" 
     ) 
     protected _route_regex => string(21) "#^(?P<path>(|.+))$#uD" 
    } 
    protected _response => object Response(5) { 
     protected _status => integer 200 
     protected _header => object Http_Header(0) { 
     } 
     protected _body => string(0) "" 
     protected _cookies => array(0) 
     protected _protocol => string(5) "https" 
    } 
    protected _header => object Http_Header(0) { 
    } 
    protected _body => string(878) "day_number=8&c_record[calendar_event][0][id]=&c_record[calendar_event][0][project_id]=1&c_record[calendar_event][0][start_date_time][date]=2011-03-08&c_record[calendar_event][0][start_date_time][hour]=8&c_record[calendar_event][0][start_date_time][min]=00&c_record[calendar_event][0][start_date_time][sec]=00&c_record[calendar_event][0][start_date_time][modulation]=am&c_record[calendar_event][0][start_date_time][modulation]=pm&c_record[calendar_event][0][end_date_time][date]=2011-03-08&c_record[calendar_event][0][end_date_time][hour]=5&c_record[calendar_event][0][end_date_time][min]=00&c_record[calendar_event][0][end_date_time][sec]=00&c_record[calendar_event][0][end_date_time][modulation]=am&c_record[calendar_event][0][end_date_time][modulation]=pm&c_record[calendar_event][0][title]=adsf&c_record[calendar_event][0][description]=asdf&c_record[calendar_event][0][link]=" 
    protected _directory => string(0) "" 
    protected _controller => string(4) "base" 
    protected _action => string(3) "404" 
    protected _uri => string(13) "calender/save" 
    protected _external => bool FALSE 
    protected _params => array(1) (
     "path" => string(13) "calender/save" 
    ) 
    protected _get => array(1) (
     1299176419 => string(0) "" 
    ) 
    protected _post => array(2) (
     "day_number" => string(1) "8" 
     "c_record" => array(1) (
      "calendar_event" => array(1) (
       0 => array(7) (
        "id" => string(0) "" 
        "project_id" => string(1) "1" 
        "start_date_time" => array(5) (
         ... 
        ) 
        "end_date_time" => array(5) (
         ... 
        ) 
        "title" => string(4) "adsf" 
        "description" => string(4) "asdf" 
        "link" => string(0) "" 
       ) 
      ) 
     ) 
    ) 
    protected _cookies => array(0) 
    protected _client => object Request_Client_Internal(5) { 
     protected _previous_environment => NULL 
     protected _cache => NULL 
     protected _allow_private_cache => bool FALSE 
     protected _request_time => NULL 
     protected _response_time => integer 1299177212 
    } 
    public status => integer 404 
} 

Here is a test to see if this uri should match a route: 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

array(5) (
    "path" => string(13) "calender/save" 
    "controller" => string(4) "base" 
    "action" => string(3) "404" 
    "uri" => string(13) "calender/save" 
    "route" => object Route(5) { 
     protected _callback => NULL 
     protected _uri => string(6) "<path>" 
     protected _regex => array(1) (
      "path" => string(5) "(|.+)" 
     ) 
     protected _defaults => array(2) (
      "controller" => string(4) "base" 
      "action" => string(3) "404" 
     ) 
     protected _route_regex => string(21) "#^(?P<path>(|.+))$#uD" 
    } 
) 

はあなたとして、働いているページ上で実行されている同じデバッグコードであります

The requested URI wasfound: 

calendar/index 

The requested URL wasfound: 

https://my.website.com/calendar/index 

Here is the request data: 

object Request(18) { 
    protected _requested_with => NULL 
    protected _method => string(3) "GET" 
    protected _protocol => string(5) "https" 
    protected _referrer => string(40) "https://my.website.com/calendar/index" 
    protected _route => object Route(5) { 
     protected _callback => NULL 
     protected _uri => string(39) "(<lang>/)<controller>(/<action>(/<id>))" 
     protected _regex => array(2) (
      "lang" => string(7) "(en-ca)" 
      "controller" => string(29) "(docrepo|calendar|maps|forum)" 
     ) 
     protected _defaults => array(3) (
      "controller" => string(7) "docrepo" 
      "lang" => NULL 
      "action" => string(5) "index" 
     ) 
     protected _route_regex => string(130) "#^(?:(?P<lang>(en-ca))/)?(?P<controller>(docrepo|calendar|maps|forum))(?:/(?P<action>[^/.,;?\n]++)(?:/(?P<id>[^/.,;?\n]++))?)?$#uD" 
    } 
    protected _response => object Response(5) { 
     protected _status => integer 200 
     protected _header => object Http_Header(0) { 
     } 
     protected _body => string(0) "" 
     protected _cookies => array(0) 
     protected _protocol => string(5) "https" 
    } 
    protected _header => object Http_Header(0) { 
    } 
    protected _body => NULL 
    protected _directory => string(0) "" 
    protected _controller => string(8) "calendar" 
    protected _action => string(5) "index" 
    protected _uri => string(14) "calendar/index" 
    protected _external => bool FALSE 
    protected _params => array(1) (
     "lang" => NULL 
    ) 
    protected _get => array(1) (
     "reset_date" => string(1) "1" 
    ) 
    protected _post => array(0) 
    protected _cookies => array(0) 
    protected _client => object Request_Client_Internal(5) { 
     protected _previous_environment => NULL 
     protected _cache => NULL 
     protected _allow_private_cache => bool FALSE 
     protected _request_time => NULL 
     protected _response_time => integer 1299178100 
    } 
} 

Here is a test to see if this uri should match a route: 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

bool FALSE 

array(5) (
    "lang" => NULL 
    "controller" => string(8) "calendar" 
    "action" => string(5) "index" 
    "uri" => string(14) "calendar/index" 
    "route" => object Route(5) { 
     protected _callback => NULL 
     protected _uri => string(39) "(<lang>/)<controller>(/<action>(/<id>))" 
     protected _regex => array(2) (
      "lang" => string(7) "(en-ca)" 
      "controller" => string(29) "(docrepo|calendar|maps|forum)" 
     ) 
     protected _defaults => array(3) (
      "controller" => string(7) "docrepo" 
      "lang" => NULL 
      "action" => string(5) "index" 
     ) 
     protected _route_regex => string(130) "#^(?:(?P<lang>(en-ca))/)?(?P<controller>(docrepo|calendar|maps|forum))(?:/(?P<action>[^/.,;?\n]++)(?:/(?P<id>[^/.,;?\n]++))?)?$#uD" 
    } 
) 

bool FALSE 

bool FALSE 

bool FALSE 

array(5) (
    "path" => string(14) "calendar/index" 
    "controller" => string(4) "base" 
    "action" => string(3) "404" 
    "uri" => string(14) "calendar/index" 
    "route" => object Route(5) { 
     protected _callback => NULL 
     protected _uri => string(6) "<path>" 
     protected _regex => array(1) (
      "path" => string(5) "(|.+)" 
     ) 
     protected _defaults => array(2) (
      "controller" => string(4) "base" 
      "action" => string(3) "404" 
     ) 
     protected _route_regex => string(21) "#^(?P<path>(|.+))$#uD" 
    } 
) 

私は、保存関数を呼び出すJavaScriptコードは次のとおりです:

calendar.save_event = function() { 
    var save_url = URL_ROOT + '/calender/save?' + TIME_STAMP; 
    // prepare the data string 
    var inputs = []; 
    // get all the form elements and add them to the parameter string to be sent via ajax 
    $('#dialog_form :input').each(function() { 
     // only add if not a checkbox, or if it is a checkbox, then it must be checked 
     if (! $(this).is(':checkbox') || $(this).is(':checked')) { 
      inputs.push(this.name + '=' + encodeURIComponent(this.value)); 
     } 
    }); 
    alert('try saving by posting to: ' + save_url); 
    // try to save the record 
    $.ajax({ 
     type: 'POST', 
     data: inputs.join('&'), 
     url: save_url, 
     dataType: 'json', 
     success: function(data, text_status) { 
      if (data['status'] == 1) { 
       alert(data['status_message']); 
       // add the event to the calendar 
       // todo add actual event details 
       $("#day_number" + $('#initial_day_number').val()).append("new event"); 
       // close the dialog box 
       $('#dialog_form').dialog("close"); 
      } else { 
       alert('The event could not be saved at this time. Please try again later. (' + data['status_message'] + ')'); 
      } 
     }, 
     error: function(xml_request, text_status, error_thrown) { 
      alert('The event could not be saved at this time. Please try again later. (' + text_status + ')'); 
     } 
    }); 
} 
正しいルートがマッチしたとして現れていることがわかります

上記のコードでは、URL_ROOTが正しく設定されています。私はもともと相対参照 '/ calendar/save'を使用していたので、これを追加しましたが、いずれも動作しませんでした。また、TIME_STAMP GETパラメータを追加しました。このパラメータは、現在のUNIXのタイムスタンプ(time()はPHPで)だけで、これがキャッシングの問題であるかどうかを確認することができます。また、何の違いもありません。

デバッグコードごとに、コールが正しいURLに送信されていることがわかります。何らかの理由で一致していないことがわかります。

ご協力いただければ幸いです。

ありがとう、Craig

+0

私の.htaccessからすべてのクールなものを取り除こうとしましたが、HTTPSのすべてのものを取り除こうとしましたが、問題はHTTPでも一貫しています。 AJAXのレスポンスを見ると、私はまだログインしていますが、セッションはうまくいきます。だから、何らかの認証の問題ではないようです。 –

+0

しばらく私はそれがHTTPのリファラーに関連していると思っていましたが、私はそれをリファラーの有無に関係なく壊すことができます。 –

答えて

0

これをコピーしたり貼り付けたりしましたか?間違ったAjaxコードのように見えるので、calendarの代わりにcalenderと入力しました。それは404デバッグ情報にも現れます。

+0

良いキャッチですが、実際には実際のURLを公開したくないため、実際に私はこの部分を再入力しなければなりませんでした。しかし、これは問題ではありませんでした。なぜなら、Ajaxで動作しなかったのと同じURLがタブで使用されていたからです。 –

関連する問題