php请求转发

  之前的项目是通过php读取html文件,挂载数据再返回给浏览器。现在想改成前后端分离模式,主要是想改变项目架构。
  之前的架构很简单,一个域名,一个根目录,不同的子目录放不同的项目。这样会出现一些问题:

  • 网站结构混乱
  • 需要在根目录下运行的应用会无法运行

  因此,这段时间将架构改了,用不同的二级域名绑定不同的目录,存放不同的项目。详见:nginx多域名(二级域名)配置.

  目前,api是在特定的二级域名(比如:api.domain.com)下,其余的项目(比如:blog.domain.com)对此域名发出请求。这样一来,就真的做到了前后端分离,特别是spa应用,优势明显。但是,对于需要后端渲染的应用,这就比较糟糕了。所以,现在的想法是,api.domain.com依然只是提供接口,对于需要后端渲染又需要用到api.domain.com下接口的应用,比如blog.domain.com,该项目下的php程序会对请求进行转发,从api.domain.com获取到数据后渲染html,然后输出给浏览器。具体做法如下:

  1. 开发服务器——我这里是本地的虚拟机——配置hosts文件,让api.domain.com指向127.0.0.1。(生产环境无需此步骤)
  2. api.domain.com下的文件允许blog.domain.com的跨域请求。
  1. blog.domain.com下的程序对请求进行转发。
  • 可以通过file_get_contents()函数转发。下面是get请求。实际上,也可以发起post请求,但我没尝试。PHP模拟发送POST请求之四、加强file_get_contents()发送POST请求
$res = file_get_contents("http://api.domain.com/?query=true");
  • 通过curl进行转发。 这里也是get请求。PHP使用CURL详解
$user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";
$url = "http://api.domain.com/?query=true";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_USERAGENT, $user_agent);
curl_setopt($curl, CURLOPT_HEADER, 0);  // 丢掉头信息,这里只需要内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1);  // 解决301错误
$res = new StdClass();
$res -> data = json_decode(curl_exec($curl));
curl_close($curl);
$res -> proxy = 'blog.domain.com';
print_r(json_encode($res));

  目前的解决方法就是这样。实际上,应该有更好的解决方法,既可以提供api接口又可以直接渲染html文件。比如有网友提出的通过node做代理。但我想想,算了,目前就这样吧,我还是多关注前端比较好。

你可能感兴趣的:(php请求转发)