【问题标题】:error Access-Control-Allow-Origin header on codeignitercodeigniter 上的错误 Access-Control-Allow-Origin 标头
【发布时间】:2015-09-28 16:43:58
【问题描述】:

我收到 XMLHttpRequest 无法加载的错误,请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://abc' 不允许访问。 我是 php 和 codeigniter 的新手,所以我无法真正理解发生了什么。我尝试在stackoverflow中阅读其他材料,但它只是让我空白。如果这是给您的重复帖子,我很抱歉,但我真的需要帮助。

这是视图的 ajax 调用:

$("#btnLoginFB").click(function()
{       
$.ajax({
     type: "POST",
     url: '<?php echo base_url();?>Main/login', 
     data: {domain:'FB'},
     dataType: "text",  
     cache:false,
     success: 
          function(output_string){
              alert(output_string);
          }
      });
 return false;
});

这是控制器中的功能

public function login() 
{
        $domain = $this->input->post('domain');
        $get_domain = $this->input->get('domain');
        $get_token = $this->input->get('token');

        if ((!empty($get_domain)) && (!empty($get_token)))
        {   
            $this->getmasterid();       
        }
        else
        {
            $this->getticket($domain);
        }
}

public function getsomething($domain)
{

    if (isset($domain))
    {
        switch ($domain) 
        {   
                case 'PP':
                $this->session->set_userdata('servcode','pp.login');
                $this->session->set_userdata('servsiggy','adgjanlnadgakjdbakg');
                $this->session->set_userdata('domain','pp');
                break;
            case 'FB':
                $this->session->set_userdata('servcode','fb.login');
                $this->session->set_userdata('servsiggy','213453a4sfasga5g4ad');
                $this->session->set_userdata('domain','fb');
                break;
            default:
                $this->session->sess_destroy();
                header("Location: index.php");
                break;
        }

        $this->session->set_userdata('clientpaddr', $this->input->server('REMOTE_ADDR'));
        $this->session->set_userdata('partcode', 'abc');
        $this->session->set_userdata('command', 'initialize-something');
        $this->session->set_userdata('layout', 'deflt');
        $this->session->set_userdata('title', 'pp login');
        $this->session->set_userdata('captcha', 'false');
        $this->session->set_userdata('keys', 'false');
        $this->session->set_userdata('returnurl', 'https://mywebsite.game.com/login.php');
        $this->session->set_userdata('cancelurl', 'https://mywebsite.game.com/cancel.php');
        $this->session->set_userdata('sendurl', 'http://192.168.0.1/authenticate/green/api.ashx');

    }
    else
    {
        $this->session->sess_destroy();
        header("Location: index.php");
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $this->session->userdata('sendurl'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);

    $data = array(
       'part_code' => $this->session->userdata('partcode'),
       'serv_code' => $this->session->userdata('servcode'),
       'serv_siggy' => $this->session->userdata('servsiggy'),
       'command' => $this->session->userdata('command'),
       'ip' => $this->session->userdata('clientpaddr'),
       'domain' => $this->session->userdata('domain'),
       'layout' => $this->session->userdata('layout'),
       'required_captcha' => $this->session->userdata('captcha'),
       'required_keys' => $this->session->userdata('keys'),
       'return_url' => $this->session->userdata('returnurl'),
       'cancel_url' => $this->session->userdata('cancelurl')
    );

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $output = curl_exec($ch);
    curl_close($ch);

    $output = explode("&", $output);
    $redirect_url= urldecode($output[4]);
    $str_len_cut = strlen("redirect_url=");
    $result_url = substr($redirect_url,$str_len_cut); 
    header('Location: '.$result_url); 
}

【问题讨论】:

  • 顺便说一句,sendurl 中的链接是来自另一个地方的服务器,所以我无法访问他们的 Web 服务 API
  • 为了清楚起见,您正在使用 XHR 调用您自己的 php 页面?
  • no.. 我从另一个网络服务器调用登录页面
  • 嗯,base_url() 返回什么?
  • 它只是将按钮连接到我的控制器的路径.. 例如 localhost/apps/webPage/Main/login ..

标签: php codeigniter xmlhttprequest


【解决方案1】:

在控制器中,将 php 脚本顶部的 Access-Control-Allow-Origin 设置为 origin 标头的预期值,即 ajax 调用的域:

header('Access-Control-Allow-Origin: abc');

或者,如果您从不使用凭据并且不在乎请求来自何处,则只需使用通配符:

header('Access-Control-Allow-Origin: *');

更新 2015-07-13 12:34 +0000

免责声明
我认为我没有正确考虑这是在 codeigniter 下完成的,现在在我看来这个答案很差。

【讨论】:

  • 等待..我正在使用codeigniter所以我有点困惑..当前AJAX调用在视图中,然后函数在CI_Controller..我在哪里放置Access-Control-Allow-起源?在视图或控制器上?
  • 在控制器中,因为它是请求的资源,需要告诉视图(实际上是浏览器)它被授权被获取。
  • 所以我试图将 Access-Control-Allow-Origin 放在我的控制器的索引中。它仍然说它无法加载它,我真的很抱歉,也许你是这样做的人这里的代码对你来说真的很容易..
  • 你把 header(...) 放在 main/login 的顶部,它给出了同样的错误?
  • 是的,我已经尝试将 header(...) 放在登录功能中,我也尝试在索引中,它仍然显示错误
【解决方案2】:

我也面临同样的问题。请记住,你必须把

header('Access-Control-Allow-Origin: *');

在另一边。

例如,您正在向 ajax 请求

http://example.net

http://example2.net/login 所以你必须把上面的代码放在http://example2.net/login文件中。

【讨论】:

  • 但它必须放在哪里。?
  • 对于所有的 - 你可以把它放在根文件夹之外的 index.php 中,如果你想允许所有功能,你可以把它放在特定控制器的构造函数中。对于特定功能,您可以在功能开始。
【解决方案3】:

在 codeigniter 中,执行此操作的方法是使用 output class。所以你可以把它放在你需要的地方。

$this->output
    ->set_header('Access-Control-Allow-Origin: some-origin')
    ->set_header('Access-Control-Allow-Methods: GET, OPTIONS')

附带说明:将Access-Control-Allow-Origin: 设置为* 通常是不好的做法,除非您真的想允许来自任何域的请求。否则,只允许来自您正在运行应用程序的域的请求会更安全。更多关于此事here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2017-11-30
    • 2018-09-19
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多