如何使用vue资源和proxy.php来解决跨域问题



首先。我想用几句话来解释一下,我完全知道什么是跨域问题,以及如何处理它(使用jQuery的普通js,但不使用vue(

情况如下:我想使用HTTPGET请求从一些地理服务器(其他域(获取WFS功能(作为xml(。很明显,由于同源政策,它将被阻止。

我曾经使用一个非常简单的proxy.php文件来解决这个问题,它运行得很好。

proxy.php文件如下:

<?php
$nix="";
$type=$_GET['requrl'];
if ($_GET['requrl'] != $nix) {
$file = file_get_contents($_GET['requrl']);
} else {
$file = "false type";
}
echo $file;
?>

因此,基本上我用JS编写了一个带有jQuery的Ajax调用。它看起来像这样:

jQuery.ajax(
type: "GET",
data: {
requrl: "www.example.com/WFS?service=wfs&request=GetCapabilities"
},
url: "proxy.php"
).done(function (response) {
// handle the response text/xml
console.log(response);
})

旧的方法运行良好,我将"true"url作为requrl送到php文件,php会得到我想要的内容,并将其作为响应返回。所以我以后可以使用jQueryajax来处理响应。


真正的问题:

但现在我正在将我的整个应用程序转移到vue.js框架中。所以我现在使用的是vue资源,而不是jQuery-ajax。

vue资源并不难理解。因此,我提出如下HTTP GET请求:

this.$http.get('/static/proxy.php', {params: {requrl:"www.google.de"}}).then(response => {
// success
console.log("oh! success!");
}, response => {
// error
console.log("oh! error!");
});

我将proxy.php文件放在public/static文件夹中,vue资源一直为我获取proxy.php的内容。但不要浏览它并重试我的响应。

我已经用firefox开发工具检查了HTTP GET请求,它显示GET请求是200 OK。但响应始终是该proxy.php的内容。php文件似乎没有完成我期望的工作。

这是我从vue资源获取请求中得到的响应:

<?php $nix=""; $type=$_GET['requrl']; if ($_GET['requrl'] != $nix) {    $file = file_get_contents($_GET['requrl']); } else {    $file = "false type"; } echo $file; ?>

我知道开发服务器可能是原因,因为在过去,我在apache本地服务器中安装了php,现在安装了vue.js。每次我想启动开发服务器时,我只需键入npm-run-serve我不知道我刚启动的是哪种开发服务器,也不知道它是否能与php一起工作

所以我想问一下你们是如何处理vue资源和php的。或者在vue.js中有更好的方法来解决跨域问题

以下是我现在使用的开发环境:该项目是用vue.js和vue/cli 3(包含webpack等(创建的我使用的插件是vuetify和vue资源


对于那些可能在未来搜索相同问题的人。我用这种方式解决了我的问题:

  1. 设置一个安装php的apache服务器(我得到了proxy.php的内容,因为我没有在开发服务器中安装php,这是由命令npm run serve启动的,这就是它不起作用的原因!(

  2. 请确保在您的apache服务器上启用CORS!因为这个apache服务器将在不同的端口(例如8888(运行,而您的vue应用程序的开发服务器将在8080默认运行!不同的端口也将被视为跨域因此,请确保在您的apache服务器上启用CORS

  3. 将您的HTTP GET请求指向您的具有vue资源的apache服务器中的proxy.php文件,这里是vue应用程序中的一个示例(我的apache服务器运行在8888端口,proxy.php文件也显示在这个问题中,在这里我用GET请求获得了我自己的IDhttp://httpbin.org/ip):

    this.$http.get('http://localhost:8888/proxy.php', {params: {requrl: "http://httpbin.org/ip"}}).then(response => {
    // success
    console.log("oh! success!");
    console.log("success response: ", response);
    }, response => {
    // error
    console.log("oh! error!")
    console.log("error response: ", response);
    });
    
  4. 现在你成功地绕过了跨域!

我把proxy.php文件放在了public/static文件夹中,vue资源不断为我获取proxy.php的内容。但没有遍历它并返回响应。

为了运行php文件,您需要配置一个本地服务器来提供和执行php文件,因为npm run serve命令只提供静态文件。(Javascript、html、css等(

我建议您安装一个Xampp,以便轻松配置PHP开发环境。

因此,您将为php环境获得一个本地服务器,并为运行在不同端口的vue应用程序获得另一个服务器。

最新更新