php – Laravel 5 – 发布路由上的htaccess HTTPS重定向不起作用.

我有一个使用Laravel 5构建的应用程序作为API.我在.htaccess文件中有以下内容将所有路由重定向到https:
RewriteEngine On

    # Force SSL
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

这适用于以下情况:

https://example.com/route

但如果我尝试使用http访问它,则抛出一个MethodNotAllowedHttpException.它正确地重定向到https,但似乎没有正确地跟随POST请求,因为我的所有路由只允许POST.

有没有办法解决这个问题而不改变我的路线以允许GET?

为了强制使用https,您的RewriteRule需要强制进行外部重定向.在您的规则的情况下,您正在强制301重定向(R = 301).大多数浏览器和客户端都设计为自动遵循重定向,但它们(错误地)使用GET请求执行此操作.

因此,当客户端向http://example.com/route发送带有数据的POST请求时,您的服务器会以301重定向响应https://example.com/route,然后客户端发出GET请求而不会数据到新URL.如您所见,您不仅可以更改路由以接受GET请求,因为原始POST请求中发送的数据将被删除.

一种选择是添加重写条件以不重定向POST请求:

# Force SSL
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_METHOD} !=POST
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

然而,这几乎打败了你试图完成的目标.整个概念是在任何地方强制https.除了将数据发布到您的应用程序之外,在任何地方强制执行它都是愚蠢的.

另一种可能的选择是将301重定向更改为307重定向.尽管客户端不应该更改301/302重定向的请求方法,但大多数客户端都会因规范和现有功能的模糊性而做.因此,307添加了一个特定的想法,即如果使用此状态代码,则不得更改请求方法.但是,307被归类为“临时重定向”,因此不会被缓存,可能会影响您的SEO.此外,此状态已添加到HTTP / 1.1规范中,因此您可能会遇到一些不知道如何处理307的客户端.

您最好的选择可能只是拒绝非安全的POST请求.或者,将它们重定向错误页面,说明您不接受非安全POST请求.

RewriteEngine On

# Forbid non-secure POSTs
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_METHOD} =POST
RewriteRule ^ / [F,L]

# Force SSL
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

相关文章

[laravel] laravel的数据库配置 找到程序目录结构下.env文件 配置基本的数据库连接信息 DB_HOST=127.0....
[Laravel] Laravel的基本HTTP路由 使用Laravel的基本路由,实现get请求响应,找到文件app/Http/routes....
如果说laravel框架的核心是什么,那么无疑是服务容器。理解服务容器的概念,对于我们使用laravel太重要...
网上有很多解析laravel中间件的实现原理,但是不知道有没有读者在读的时候不明白,作者是怎么想到要用a...
laraveli添加一个或多个用户表,以admin为例。 部分文件内容可能需要根据实际情况修改 创建一个Admin模...
TL;DR: 本文介绍 Laravel 的 FastExcel 组件,文中会对 PHP generators 速览,并给出如何在节约内存的同...