如果初始连接是HTTPS,则将HTTP请求定向为HTTPS,但如果是HTTP,则不定向


Directing HTTP requests to HTTPS if initial connection is HTTPS but not if it is HTTP

我有一个在Apache服务器上运行WordPress的网站,我正试图通过同一个网站提供HTTP和HTTPS连接。我希望在不强制重定向到HTTPS的情况下允许通过HTTP进行连接,除非客户端最初是通过HTTPS进行连接,否则我希望所有后续的HTTP请求都转发到HTTPS,以避免CORS和不安全的内容警告问题。

我在查看如何单独使用mod_rewrite有效地做到这一点的结果时遇到了一些困难。我找到的大多数解决方案都试图强制连接重定向到HTTPS,而不允许HTTP连接,反之亦然。我尝试了一些mod重写条件,包括使用referer字符串,但到目前为止似乎都不起作用。我一定错过了什么,因为我觉得这确实是可能的,但我和我的搜索引擎都被难住了。

也许我只是做错了什么,或者这种功能超出了Mod_Rewrite吗?我想使用PHP脚本,但担心它不适用于一些静态文件,因为WordPress不处理这些请求。

更新:

我制作了一个php脚本来检测版本。它设置一个cookie,该cookie在设置后20秒内过期,由Mod_Rewrite读取,如果设置,则将URL重定向到HTTPS。这适用于初始HTTPS请求的大多数后续请求。一些URL似乎不受其影响,不确定确切的原因,因为在这些文件请求时cookie还没有过期,并且特定规则在htaccess文件中的静态文件绕过规则之前。无论如何,通过将文件URL设置为无协议版本,这已经足够容易修复了。一些第三方网站需要重写域,因为它们提供来自其他域的https。在这一点上,我认为如果不缓冲整个页面并重新编写URL,这实际上是不可能的。

可以检测初始连接,但必须使用服务器端代码(如PHP脚本)来完成。然后可以在Mod_Rewrite级别上使用检测。

再加上WordPress的限制,事情就会变得复杂起来。

WordPress并不是为了方便一次安装而构建的,两种协议都允许访问内容。因此,要实现这一点,需要一个使用前面提到的检测的自定义插件,而不是使用Mod_Rewrite来引导服务器上的请求,我们必须缓冲WordPress输出,并在URL到达用户之前逻辑地替换/重写页面中的URL,如果且仅当页面的初始连接是SSL时。

我只发现了一个插件可以做类似的事情,但它不做动态检测,只给管理员/编辑一个复选框选项,使页面SSL安全。该插件名为WordPress HTTPS

无论如何,动态检测和重定向并不是SSL的本意,它是打开或关闭的,大多数页面都需要它
我最初试图同时提供这两种证书,这样我就可以使用自签名证书,而不用担心用户会通过强制他们只使用SSL连接而从浏览器收到"警告不安全连接"消息。

所以我将购买一个证书或制作一个自定义插件。

tkausl是对的,您实际上不需要执行mod_rewrite。你应该能够在没有协议的情况下格式化链接,它会自动为你选择。

你可以看到谷歌用他们的托管库做到了这一点:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

*请注意,缺少http:或https:,这将遵循用户请求的协议。