Laravel 5 - post 路由上的 htaccess HTTPS 重定向不起作用。

问题描述 投票:0回答:2

我有一个使用 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 吗?

php .htaccess laravel redirect laravel-5
2个回答
4
投票

为了强制 https,您的 RewriteRule 需要强制外部重定向。对于您的规则,您将强制执行 301 重定向 (

R=301
)。大多数浏览器和客户端都被设计为自动遵循重定向,但它们(错误地)通过 GET 请求来执行此操作。

因此,当客户端向

http://example.com/route
发送包含数据的 POST 请求时,服务器会响应 301 重定向到
https://example.com/route
,然后客户端向新 URL 发出不带数据的 GET 请求。正如您所看到的,您不能只更改路由来接受 GET 请求,因为原始 POST 请求中发送的数据将被丢弃。

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

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

但是,这几乎违背了您试图实现的目的。这整个概念就是在任何地方强制使用 https。除了将数据发布到应用程序时之外,在任何地方强制执行它都是愚蠢的。

另一个可能的选择是将 301 重定向更改为 307 或 308 重定向。尽管客户端不应更改 301/302 重定向的请求方法,但由于规范和现有功能不明确,大多数客户端都会这样做。因此,添加 307 的具体想法是,如果使用此状态代码,则不得更改请求方法。

但是,307 被归类为“临时重定向”,因此不会被缓存,可能会影响您的 SEO。此外,此状态是在 HTTP/1.1 规范中添加的,因此您可能会遇到一些不知道如何处理 307 的客户端。

相比之下,308被归类为“永久重定向”,因此可以被缓存并且不影响SEO。然而,它于 2014 年 6 月首次推出,甚至晚于 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]

0
投票

在apache.conf中添加以下配置

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        Require all granted
</Directory>
© www.soinside.com 2019 - 2024. All rights reserved.