kohana 3 路由在某些情况下失败

发布于 2024-10-20 07:45:54 字数 11899 浏览 6 评论 0原文

我在 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',
));
  • 这条路线似乎在几乎所有情况下都能正常工作,
  • 导致我出现问题的具体情况是: /calendar/save
  • 直接从 Safari 或 IE 中的选项卡访问 /calendar/save 路线 始终有效(例如https://my.site.com/calendar/save)
  • 直接从 Firefox 中的选项卡访问 /calendar/save 路径有时有效(例如 https://my.site.com/calendar/save
  • 在任何浏览器中从 AJAX 访问 /calendar/save 路由总是失败并且页面最终被我的捕获捕获-all 路由并发送到 404 页面,全包路由如下所示
  • ,访问同一控制器的另一个操作,并且路由始终有效(即使通过 AJAX)(例如 https://my.site.com/calendar/edit 在所有浏览器中直接或通过 AJAX 工作正常)

包罗万象的路线是:

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 时间戳(php 中的 time()),以查看这是否是缓存问题。这也没有任何区别。

根据调试代码,您可以看到调用将转到正确的 URL,只是由于某种原因未匹配。

任何帮助将不胜感激。

谢谢,克雷格

I am having a very annoying problem with Kohana 3 routes and/or something else that is causing my routes to fail.

The route in question is defined as:

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',
));
  • this route seems to be working fine for almost all cases
  • the specific case that is causing me problems is: /calendar/save
  • accessing the /calendar/save route directly from a tab in Safari or IE always works (e.g. https://my.site.com/calendar/save)
  • accessing the /calendar/save route directly from a tab in Firefox sometimes works (e.g. https://my.site.com/calendar/save)
  • accessing the /calendar/save route from AJAX in any browser always fails and the page ends up getting caught by my catch-all route and sent to a 404 page, the catch-all route is shown below
  • accessing another action for the same controller and route always works (even via AJAX) (e.g. https://my.site.com/calendar/edit works fine directly or via AJAX in all browsers)

The catch-all route is:

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

There are no errors in my apache logs since everything is working as per apache and php.

There are no errors in my Kohana logs since everything is working according to Kohana.

I added some debug code to my 404 page and here is the output from the ajax call to calendar/save:

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"
    }
)

Here is the same debug code running on a page that is working, as you can see the correct route is showing up as matched:

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"
    }
)

The javascript code where I call the save function is:

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 + ')');
        }
    });
}

In the above code, URL_ROOT is set correctly. I added this in because I was originally using a relative reference '/calendar/save' but neither works. I also added the TIME_STAMP GET parameter which is just the current UNIX timestamp (time() in php) to see if this was a caching issue. It also does not make any difference.

As per the debug code, you can see that the call is going to the correct URL, it is just not getting matched for some reason.

Any help would be greatly appreciated.

Thanks, Craig

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怪我鬧 2024-10-27 07:45:54

您是复制/粘贴还是输入的?因为看起来在错误的 ajax 代码中,您输入的是 calender 而不是 calendar。这也显示在 404 调试信息中。

Did you copy/paste this or typed it up? Because it seems like in the erroneous ajax code, you typed calender instead of calendar. That shows up in the 404 debug info, too.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文