ajax - 在 Apache 服务器上启用 ssl 后 AJAX POST 请求出现错误 301

标签 ajax laravel ssl cors

我正在构建一个简单的基于 Laravel 的 REST API(它通过基于 apache 的 Ubuntu 服务器提供服务),Angular 6 网络应用程序通过其 HttpClient 模块使用它。

在我将它上传到 Firebase 托管(启用 https)之前,它在我的本地主机上正常工作。所以我不得不在我的服务器上实现商业 SSL 证书,它工作得很好,通过 POSTMAN 处理 POST 请求或通过 Google Chrome 处理 GET 请求,但是当我尝试从我的网络应用程序调用它时,它显示此错误:

enter image description here

我的客户端代码非常简单:

generateReport(data) {
    const headers = new HttpHeaders({"Content-Type":"application/json"});
    return this.httpClient.post(this.env.apiURL+'excel/show/',
      data,
      {headers:headers});
  }

这是我的虚拟主机配置:

<VirtualHost *:443>
        ServerName eduardoibarra.com
        ServerAlias www.eduardoibarra.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine  on
        SSLCertificateFile /root/www_eduardoibarra_com.crt
        SSLCertificateKeyFile /root/server.key
        SSLCertificateChainFile /root/COMODORSADomainValidationSecureServerCA.crt
        <Directory /var/www/html>
                Order Allow,Deny
                Options FollowSymLinks
                Allow from all
                AllowOverride All
                RewriteEngine On
        </Directory>
</VirtualHost>

综上所述,

Http server + localhost client environment = worked correctly

Https server + POSTMAN OR Chrome = works correctly

Https server + https client environment = gives above 301 error

*注意:我还通过 barry 的 cors 库在 Laravel 上启用了 CORS,直接在 public/index.php 文件上使用 header 和在虚拟主机配置上启用了相同的结果。

最佳答案

也许您需要在 Access-Allow-Control-Methods 中明确允许使用 OPTIONS 方法。同样在 apache 中,您应该捕获 OPTIONS 并返回 http 状态 200,因为 OPTIONS 返回 301 重定向。

尝试类似下面的 apache 设置:

<Location /laravel/public>
    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
    Header always set Access-Control-Max-Age "1000"
    Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"

    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} OPTIONS
    RewriteRule ^(.*)$ $1 [R=200,L]
</Location>

关于ajax - 在 Apache 服务器上启用 ssl 后 AJAX POST 请求出现错误 301,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52823352/

相关文章:

javascript - ajax 不再工作后 jquery select2

javascript - 从 HTML (JS) 到 PHP 的复选框状态

php - 如何格式化日期 Carbon :now() in Laravel PHP

mysql - 让 Laravel 在插入/更新时使用 MySQL 默认值

PHP Laravel : understanding this closure

authentication - 仅针对某些 URL 的 SSL 客户端证书身份验证?

javascript - Extjs MVC 嵌套 View 事件和异步函数

php - AJAX仅在IE中加载一次

ruby-on-rails - Rack Web 服务器和 https : tutorial?

Android、Golang 和 SSL