CodeIgniter 将 URL 的每一段视为控制器和方法之后的参数。因此,您实际上是将 7 个变量传递给该Email::email_invoice()
方法。
您可以使用某种编码将其作为一个变量传递,然后在另一侧对其进行解码,例如:
$file = base64_encode($file);
redirect('email/email_invoice/' . $file);
然后在 Email.php 中:
public function email_invoice($file) {
$file = base64_decode($file);
}
或者您可以将其作为 get 参数传递:
redirect('email/email_invoice/?file=' . $file);
public function email_invoice() {
$file = $this->input->get('file');
}
后者需要启用 $_GET 数组,默认情况下它不是。
更新 - 使用 Flashdata
根据一些评论,我想我会更新这个答案。base64_encode()
可能会导致破坏 URL 的字符,因此您需要使用:
$file = urlencode(base64_encode($file));
redirect('email/email_invoice/' . $file);
另一方面:
public function email_invoice($file) {
$file = urldecode(base64_decode($file));
}
正如 OP 指出的那样,可以操纵 $_GET 变量,从而使您容易受到目录遍历攻击或其他漏洞的影响。即使做得正确,您也需要额外的代码来保证安全。编码很容易被发现和改变。
文件路径可能不应该出现在 URL 中。即使不那么明显,也可以操纵 POST 数据。通过默默无闻的安全根本不是安全。更好的方法是使用flashdata。
$this->session->set_flashdata('email_invoice_pdf', $file);
redirect('email/email_invoice/');
然后在你的控制器中:
public function email_invoice() {
$file = $this->session->flashdata('email_invoice_pdf');
}
而已。该会话用于将文件路径携带到下一页请求,但之后它就消失了。