无需使用重定向301将HTTP重定向到HTTPS

3

我需要在我的网站上默认使用https,因此我使用了以下.htaccess代码将所有http流量重定向到https

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

除了网站接收到许多POST请求来自旧的http://地址并且在使用301时POST数据丢失之外,一切都很正常。我无法阻止POST请求来自旧的http://地址,因为它们来自基于PHP的脚本(安装在客户端服务器上),所以我的唯一选择似乎是307或308重定向(因为它们保留POST数据)。
然而,重定向307被认为是临时的,而我计划永久使用https,所以这似乎不是最好的选择?当然,我可以使用308,但是这个选项似乎是“新的”,并且并非所有浏览器都支持(根据我在stackoverflow上找到的许多评论)。也许有人知道更好的.htaccess重写规则?
附言:我知道最好的想法是使用301重定向并将脚本修改为默认使用https进行发布(我已经这样做了),但是这可能需要很长时间,而所有客户端都将更新其服务器上的脚本,所以还需要另一个解决方法。

2
POST请求中的数据是否需要保护?如果不需要,您最简单的选择可能是为该端点添加一个例外,并在之后重定向到HTTPS;如果需要保护,则需要更新客户端使用的PHP脚本。 - Adrian Wragg
@AdrianWragg 发送的数据在 http post 请求中并没有加密,一旦请求到达,事情已经出了问题,数据已经暴露。OP 无法阻止这种情况发生。因此,坚持重定向到 https post 请求是没有任何意义的。这就是为什么您建议实现一个异常处理是有意义的原因! - arkascha
1
@MindaugasLi,你不能使用“单一协议”,因为你自己已经说明客户端发送http请求。你无法以某种神奇的方式阻止或更改客户端的操作。你所能做的就是尽力处理请求,然后在发送回复时进行重定向。 - arkascha
它确实取决于浏览器的支持;然而,这是您可以通过分析和/或浏览器在请求中发送的客户端标识符来访问的信息。这将为您提供有关用户浏览器可能如何处理的一些想法。 - Adrian Wragg
所有的POST请求都不是从浏览器发出的,而是直接使用CURL从PHP脚本中发出的。在不同服务器和不同PHP版本上测试了重定向308,似乎PHP CURL支持它。我只担心当一些访问者使用不支持308的浏览器访问网站主页时会发生什么。 - Mindaugas Li
显示剩余6条评论
1个回答

2
保留301重定向,但将您的条件更改为以下内容:
RewriteCond %{HTTPS} =off
RewriteCond %{REQUEST_METHOD} !=POST

如果你的客户遗留脚本使用任何其他方法,你将不得不更改第二个条件来包括它,例如:
RewriteCond %{REQUEST_METHOD} !^(?:POST|PUT)$

普通的请求/爬取始终以GETHEAD开始,因此被迫使用https,因此后续的请求也将使用它。确保您网站内容中的所有URL都是相对或根相对的。


谢谢,目前看来这似乎是最好的解决方案。 - Mindaugas Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接