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

前端之家收集整理的这篇文章主要介绍了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相关文章