Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在CodeIgniter中检查请求是否通过AJAX发出?_Php_Ajax_Codeigniter - Fatal编程技术网

Php 如何在CodeIgniter中检查请求是否通过AJAX发出?

Php 如何在CodeIgniter中检查请求是否通过AJAX发出?,php,ajax,codeigniter,Php,Ajax,Codeigniter,如何检查请求是否是AJAX?我正在使用CodeIgniter。我有一个链接,当它单击时,它会打开弹出对话框窗口。这是通过ajax完成的,它请求控制器名login\u window() 共点火器 jQuery //以下是jquery代码: //我正在使用jquery插件FACEBOX $('a[rel*=dialog]')。facebox(); 我想检查它是否是一个AJAX请求,如果不是,我会将它们重定向到主页。因此,他们无法访问仅用于ajax请求的页面。如果您使用的库发送带有X-request

如何检查请求是否是AJAX?我正在使用CodeIgniter。我有一个链接,当它单击时,它会打开弹出对话框窗口。这是通过ajax完成的,它请求控制器名
login\u window()

共点火器 jQuery
//以下是jquery代码:
//我正在使用jquery插件FACEBOX
$('a[rel*=dialog]')。facebox();

我想检查它是否是一个AJAX请求,如果不是,我会将它们重定向到主页。因此,他们无法访问仅用于ajax请求的页面。

如果您使用的库发送带有
X-request-With
头的
X-request-With,那么您可以

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

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

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


如果您仍在寻找一个完美的解决方案(HTTP_X_REQUESTED_WITH并不总是可靠的,因为您的库可能不支持这一点。如果用户支持代理,它甚至可能被代理剥离),请尝试使用来保护您的ajax api。CREAMS用于流验证,确保用户通过预定义/预定义流而不是直接访问api。

从Codeigniter 2.0开始,最好使用
$this->input->is_ajax_request()

在Yii中,您只需检查即可

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

如果您使用jQuery或其他主要的javascript库,它可以工作。如果您执行自定义请求,请不要忘记在我们可以使用的Codeigniter中将
X-request-With
HTTP头设置为
XMLHttpRequest

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.
}

Codeigniter具有内置函数,用于检查请求是否使用Ajax调用发出

您可以使用以下方法验证是否使用Ajax调用了
控制器/段

<?php
Class Only_ajax extends CI_controller{

   function validate_user()
  {
     /*
      * Check if URL only_ajax/validate_url is called from ajax
      * if not display not found error to user.
      *
      **/

     if(!$this->input->is_ajax_request()){
       show_404();
     }

  }

}

@prodigitalson只是风格,我经常使用Kohana框架,这(而且我认为它读起来也更好)。请停止使用和/或代替&/| |,它们不一样!查看此问题了解更多详细信息Kohana框架违反PSR标准(他们使用snake_case、Allman样式等…),不要在其他地方应用他们的任何约定@alex你知道它们不一样,我知道它们不一样,但是如果其他人发现了你的代码,却不知道它们之间的区别,他们会认为它们是一样的。请不要再这样做了,尤其是如果你知道它是错的。@Msterjinx它本身并没有错,只是一种不同的风格,有一些优先级的差异。如果有人对两个不同的运营商做出假设,我该受责备吗?无论如何,我删除了它并使用了建议的编辑。我讨厌方法名称中的下划线。但是+1表示在你的OP答案中坚持使用CodeIgniter。因为这个问题与CodeIgniter相关,所以这是最好的答案!仍在使用CodeIgniter 3.0!如果javascript被关闭或者恰好被另一个脚本破坏,还可以使用ajax。这些请求可能需要返回html,而不是ajax请求所期望的任何内容。
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.
}
<?php
Class Only_ajax extends CI_controller{

   function validate_user()
  {
     /*
      * Check if URL only_ajax/validate_url is called from ajax
      * if not display not found error to user.
      *
      **/

     if(!$this->input->is_ajax_request()){
       show_404();
     }

  }

}