我有一个使用Laravel 5构建的应用程序作为API.我在.htaccess文件中有以下内容将所有路由重定向到https:
RewriteEngine On # Force SSL RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
这适用于以下情况:
但如果我尝试使用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请求中发送的数据将被删除.
# 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]