php - 如何使用vue-resource和proxy.php解决跨域问题
问题描述
首先。我想用几句话来解释一下,我完全清楚什么是跨域问题以及如何处理它(在普通的 js 和 jQuery 中,但在 vue 中没有)
情况如下:我想使用HTTP GET 请求从一些地理服务器(其他域)获取 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;
?>
所以基本上我用 jQuery 在 JS 中编写了一个 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);
})
旧方法效果很好,我将“真实”网址作为requrl发送到 php 文件,php 得到我想要的并将其作为响应返回。所以我以后可以用 jQuery-ajax 处理响应。
真正的问题:
但现在我将整个应用程序移至 vue.js 框架。所以我现在使用 vue-resource 而不是 jQuery-ajax。
vue-resource 不难理解。所以我发出 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-resource 不断为我获取 proxy.php 的内容。但不要通过它并重新给我回复。
我已经使用 firefox 开发工具检查了 HTTP GET 请求,它显示 GET 请求是 200 OK。但响应始终是该 proxy.php 的内容。似乎php 文件没有完成我预期的工作。
这是我从 vue-resource GET 请求中得到的响应:
<?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-resource和php。或者也许 vue.js 中有更好的方法来解决跨域问题?
这里是我现在使用的开发环境:项目是用vue.js和vue/cli 3创建的(包含webpack等)我使用的插件是vuetify和vue-resource
对于那些将来可能会寻找相同问题的人。我以这种方式解决了我的问题:
设置一个 apache 服务器,通过它安装 php(我得到了我的 proxy.php 的内容,因为我没有在 dev 服务器中安装 php,它是由命令 npm run serve 启动的,这就是为什么它没有工作!)
确保在 apache 服务器上启用CORS !因为这个 apache 服务器将在不同的端口(例如 8888)上运行,而您的 vue 应用程序的开发服务器将默认在 8080 上运行!并且不同的端口也将被视为跨域!因此,请确保在您的 apache 服务器上启用 CORS!
使用 vue-resource 将您的 HTTP GET 请求指向您的 apache 服务器中的 proxy.php 文件,这里是 vue 应用程序中的一个示例(我的 apache 服务器在端口 8888 上运行,proxy.php 文件也显示在这个问题中,这里我通过对 url http://httpbin.org/ip的 GET 请求获得了我自己的 ID ):
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); });
现在你成功绕过了跨域!
解决方案
我将 proxy.php 文件放在 public/static 文件夹中,并且 vue-resource 不断为我获取 proxy.php 的内容。但不要通过它并给我回复。
为了运行您的 php 文件,您需要配置一个本地服务器来提供和执行 php 文件,因为您的npm run serve
命令只提供静态文件。(Javascript, html, css 等)
我建议你安装一个Xampp来轻松配置 PHP 开发环境。
因此,您将获得一个用于您的 php 环境的本地服务器和另一个用于在不同端口上运行的 vue 应用程序。
推荐阅读
- java - FirebaseMessagingService 在 onCreate() 之后立即销毁
- javascript - 禁用后启用输入
- javascript - xPages Axis中的DojoX Charting不显示和丢失值
- c# - 访问与 GroupBy() 项目有关的列表中的项目
- php - 如果 PrestaShop 17.7.2 上的 php 7.3 出现问题,则 php 版本 (7.4) 和错误 500
- javascript - 我可以将属性设置为 JS 数组,那么现在原始数组是哪种数据类型?
- google-cloud-platform - 如何在terraform的另一个模块中使用模块值
- linux - 如何在 Manjaro KDE 上运行具有特定主题的 QT 应用程序
- python - 如何在熊猫中按一个月的最后一个日期分组
- python - 了解 z3 中的量词