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
私の.htaccessからすべてのクールなものを取り除こうとしましたが、HTTPSのすべてのものを取り除こうとしましたが、問題はHTTPでも一貫しています。 AJAXのレスポンスを見ると、私はまだログインしていますが、セッションはうまくいきます。だから、何らかの認証の問題ではないようです。 –
しばらく私はそれがHTTPのリファラーに関連していると思っていましたが、私はそれをリファラーの有無に関係なく壊すことができます。 –