【问题标题】:Error 301 on AJAX POST request after enabling ssl on Apache Server在 Apache 服务器上启用 ssl 后,AJAX POST 请求出现错误 301
【发布时间】:2019-03-20 06:31:43
【问题描述】:

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

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

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

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 服务器 + localhost 客户端环境 = 正常工作

Https 服务器 + POSTMAN 或 Chrome = 正常工作

Https 服务器 + https 客户端环境 = 出现上述 301 错误

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

【问题讨论】:

  • allowedOrigins =&gt; ['troy-da34b.firebaseapp.com']了吗,顺便说一下你的服务器根需要/var/www/html/public所以你可以请求POST https://eduardoibarra.com/excel/show
  • 感谢 Thijs Bouwes,我做了这两件事都没有运气(调用 eduardoibarra.com/excel/show 会导致 404,因为 laravel 的工作方式)。将域添加到 allowedOrigins 会导致相同的 301 错误。
  • 嗯,如果您设置 apache 为公共目录提供服务,eduardoibarra.com/excel/show 不应导致 404。你重新加载 apache 了吗?
  • 是的,但问题是我的 apache 服务器服务于 /var/www/html/ 我在这个目录中有几个项目,其中一个是 laravel 文件夹。我将尝试使用子域更正此问题,但在我按原样移至 https 之前它工作正常。
  • 我不推荐这种结构,它有安全风险。将项目移动到那里自己的文件夹并从那里提供服务。 Laravel 旨在从公共目录提供服务。

标签: ajax laravel ssl cors


【解决方案1】:

也许您需要在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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多