Vue-select 组件的混合内容

Mixed Content on Vue-select Component

这有点奇怪。

在我的本地开发环境中,这工作得很好,但一旦我进入暂存或实时服务器 - 事情就不会那么顺利了。

我正在使用 Vue.js 的 https://vue-select.org/ 组件来根据用户输入提取选项。当 select 文本区域发生变化时,我对方法进行去抖动并将字符串触发为 API 并拉回与用户输入相关的任何结果。然后将其填充到 'options' 数组中,select 动态更新和使用该数组。

API link 是使用我的 .env 文件中的变量指定的。在我使用 Laravel Valet 的本地环境中,这工作正常。

当站点切换到实时服务器时,事情就变得有趣了。当我尝试在 select 字段中输入一个值时,我得到了这个结果:

Mixed Content: The page at 'https://example.com/cv/1fa2383/edit' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://example.com/api/job_title_names'. This request has been blocked; the content must be served over HTTPS.

现在,您会假设这是因为请求是通过 HTTP 而不是 HTTPS 加载的。这是奇怪的部分。没有硬编码或定义为变量的地方没有 HTTP 请求,只有 HTTPS。我已经对这个和 re-written 甚至 hard-coded HTTPS links 进行了四重测试,但由于某种原因,该组件一直尝试通过 HTTP 加载请求。

这真的很奇怪,因为它试图触发两个请求。一个是 GET,另一个是 POST。 POST 是我的 Axios 脚本应该做的,但是由于某些未知原因添加了 GET 请求。正如您将在下面看到的,没有为该组件的获取请求构建代码。

我对此束手无策。以下是有关我的组件和元素参考的一些信息:

我的环境变量:(.test 是我的开发顶级域名)。

  1. test 是我的开发顶级域名
  2. /api/ 是我的大部分 axios 请求所经过的。
APP_URL=http://example.test
APP_API_URL=http://example.test/api/

我的输入:

<label>
    <span class="block font-bold mb-2 text-grey-500 text-sm">Job Title <i class="fad fa-question-circle leading-none text-blue-400" v-tooltip.top-center="'What was your role in this company?'"></i></span>
    <v-select taggable :options="jobTitleOptions" @search="fetchJobTitleOptions" v-model="newEmployment.jobTitle" :filterable="false" class="dynamic-select" placeholder="Type a Job Title">
        <template slot="no-options">
            Type to find your job title...
        </template>
    </v-select>
</label>

我的方法:

fetchJobTitleOptions (search, loading) {
    loading(true);
    this.searchJobTitles(loading, search, this);
},
searchJobTitles: _.debounce((loading, search, vm) => {
    console.log('Job Title Url: ' + vm.jobTitleOptionsUrl);
    if(search != '') {
        axios.post(vm.jobTitleOptionsUrl, {
            name: escape(search)
        })
        .then(response => {
            let data = response.data;
            vm.jobTitleOptions = data;
            loading(false);
        });
    } else {
        loading(false);
    }
}, 500),

计算:

jobTitleOptionsUrl: function() {
    return this.url + 'job_title_names/'
},

我的组件参考:

  1. apiurlAPP_API_URL的值赋给了不同的vue变量。
<edit-employment :apiurl="apiurl" :cvid="this.cv_id"></edit-employment>

Blade 模板:

@extends('layouts/app')
@section('content')
    <edit-cv url="{{ env('APP_URL') }}" api="{{ env('APP_API_URL') }}" cvid="{{ $cv_id }}" urlslug="{{ $url_slug }}"></edit-cv>
@endsection

使用 Vue 工具,我可以看到所有 link 都被正确引用,没有一个在它们之前有 HTTP 前缀。

我在本地环境中是 运行 Nginx,但在我的服务器上是 运行 Apache。我不确定这是否有助于诊断?

我尝试解决此问题的步骤:

如有任何帮助,我们将不胜感激。

谢谢

我通过仔细检查我的路线解决了这个问题。在 Laravel 中使用 API 尤其是 Axios 时,如果路由末尾有尾随 /,这会导致请求 301。删除尾随斜杠后,一切正常。

所以这条路线:

return this.url + 'job_title_names/'

变成这样:

return this.url + 'job_title_names'