我想知道是否有任何方法可以限制通过URL访问我的控制器功能。但我想通过网站上的链接给他们打电话。例如,如果我的网站中有一个指向控制器功能的链接:
<a href='test/function'>Call me</a>
但是当我将上述URL放在我的浏览器地址栏中时,我不希望调用控制器功能。任何人都可以帮忙吗?
答案 0 :(得分:3)
这是不可能的。 Apache和CodeIgniter允许通过手动输入的浏览器URL或访问的超链接访问您的PHP脚本到外部世界。这两种方案都以完全相同的方式连接到您的Web应用程序,但它们只是以不同方式实现。
您可以通过以下方式仅允许访问CodeIgniter脚本(即阻止公共用户访问控制器):
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
正如马库斯指出的那样,你可以使用类似的东西:
if (!$_SERVER['HTTP_REFERER']) $this->redirect('/home');
但它通常非常不一致。
答案 1 :(得分:2)
解决方案:将此代码放在每个控制器方法的开头
if (defined('BASEPATH') && !$this->input->is_ajax_request())
exit('No direct script access allowed');
答案 2 :(得分:0)
正如您在评论中所述,如果您想通过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请求时进行访问。
答案 3 :(得分:0)
这确实有帮助。我还将此添加为附加检查
$allowed_host = gethostname();
$host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
if(substr($host, 0 - strlen($allowed_host)) != $allowed_host)
$this->redirect('/home');`
答案 4 :(得分:0)
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')) ;
}
表格验证你会把这个条件放在这个条件下......这肯定会有效..