如何检查请求是否通过CodeIgniter中的AJAX进行?

如何检查请求是否是AJAX? 我正在使用CodeIgniter。 我有一个链接,当它点击时,它会打开popup对话窗口,这是通过ajax它要求一个控制器名称login_window()

 //Here is the controller name: function login_window(){ // request via ajax $this->load->view("login_window"); } 

jQuery的

 //here is the jquery code: //I am using a jquery plugin FACEBOX $('a[rel*=dialog]').facebox(); <a href="http://localhost/codeigniter/login_window" rel="dialog">Login</a> 

我想检查它是否是一个AJAX请求,如果不是,我会将它们redirect到主页。 所以他们无法访问仅用于Ajax请求的页面。

如果您正在使用发送X-Requested-With标题的库,则可以执行以下操作:

 if (strtolower(filter_input(INPUT_SERVER, 'HTTP_X_REQUESTED_WITH')) === 'xmlhttprequest') { // I'm AJAX! } 

至于Codeigniter 2.0,最好使用$this->input->is_ajax_request()

我认为你基本上是希望保护你的ajax API不被用户直接访问。 你希望用户能够通过你自己的代码(javascript等)调用时访问ajax api,但是如果用户试图直接点击api,则应该被拒绝访问。

如果你仍然在寻找一个完美的解决scheme(HTTP_X_REQUESTED_WITH并不总是可靠的,因为你的库可能不支持这一点,即使它可能会被代理剥离,如果用户在一个后面)尝试使用面包屑来保护你的ajax API。 面包屑用于stream量validation,确保用户通过预先定义的stream量而不是直接访问API。

在Codeigniter中我们可以使用

 if(!$this->input->is_ajax_request()){ // check if request comes from an ajax redirect(site_url('home'),'refresh'); // if the request is not coming from an ajax redirect to home controller. } 

而不是检测您的请求是否是ajax请求(可以是任何HTTP动词 – GET / POST / HEAD),您可以尝试添加/修改路由到您的routes.php以专门处理这些场景。

在Yii你只需检查

  if (Yii::app()->request->isAjaxRequest) 

如果你使用jQuery或其他主要的JavaScript库,它的作品。 如果您执行自定义请求,请不要忘记将X-Requested-With HTTP标头设置为XMLHttpRequest