我想知道是否有任何方法可以限制通过 URL 访问我的控制器功能。但我想通过我在网站上的链接给他们打电话。例如,如果我的站点中有一个指向控制器功能的链接:
<a href='test/function'>Call me</a>
但是当我将上述 URL 放在浏览器地址栏中时,我不希望调用控制器函数。有人能帮忙吗?
我想知道是否有任何方法可以限制通过 URL 访问我的控制器功能。但我想通过我在网站上的链接给他们打电话。例如,如果我的站点中有一个指向控制器功能的链接:
<a href='test/function'>Call me</a>
但是当我将上述 URL 放在浏览器地址栏中时,我不希望调用控制器函数。有人能帮忙吗?
这是不可能的。Apache 和 CodeIgniter 允许通过手动输入的浏览器 URL 或访问的超链接访问您的 PHP 脚本到外部世界。两种方案都以完全相同的方式连接到您的 Web 应用程序,但它们的到达方式不同。
您可以使用以下方法仅允许访问您的 CodeIgniter 脚本(即阻止公共用户访问控制器):
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
正如马库斯所指出的,你可以使用类似的东西:
if (!$_SERVER['HTTP_REFERER']) $this->redirect('/home');
但它往往非常不一致。
解决方法:将此代码放在每个控制器方法的开头
if (defined('BASEPATH') && !$this->input->is_ajax_request())
exit('No direct script access allowed');
正如您在评论中所说,如果您想通过 AJAX 加载链接:
您的标记:
<a href="test/function" data-key="abc">
你的jQuery:
$('a').on('click',function(){
var data = $(this).data('key');
$('#result').load($(this).attr("href") + '?key=' + data);
});
然后在您的 CodeIgniter 控制器中,您检查您的密钥是否存在并匹配(“abc”),否则您返回 403 或类似的东西。
此外,您当然可以检查$_SERVER['HTTP_REFERER']
用户来自哪里(但这很容易被欺骗),并且仅在您自己的站点发出 GET 请求时才允许访问。
这真的很有帮助。我还将此添加为附加检查
$allowed_host = gethostname();
$host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
if(substr($host, 0 - strlen($allowed_host)) != $allowed_host)
$this->redirect('/home');`
In view: `<input type="hidden" value="1" name="back">`
put inside your function in Controller:
if(($this->input->post('back'))==1)
{
echo " what you want do here";
}
else
{
$this->load->view('template',array('welcome_page')) ;
}
表单验证,您将在此 if 条件中输入..这肯定会工作..