将混合内容重定向到HTTPS

时间:2016-01-31 09:28:54

标签: .htaccess redirect ssl https

当通过HTTPS访问网站时,有没有办法使用htaccess重定向条件和重定向来捕获通过HTTP调用的内容?

如果通过HTTPS访问网站,http内容将被重定向到https等效网址?

基本上,当我通过HTTPS访问我的网站时,我想要一种自动化的方式来清理和处理混合内容。

到目前为止,以下修复了通过HTTPS访问网站时通过HTTP调用的所有.css和.js文件。

RewriteRule ^/(.*):SSL$   https://%{SERVER_NAME}/$1 [R,L]
RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [R,L]

但由于某些原因,这不会重定向我的网站上的图像请求(例如)在HTTPS会话期间通过HTTP调用。

我也试过这个规则,

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

但这并没有重定向图像。

我认为必须有一种方法来测试连接是否通过HTTPS,然后将任何http:// urls重写为https://等效。我只是不确定如何正确制定规则。

4 个答案:

答案 0 :(得分:8)

这不起作用。

浏览器将看到http请求并将页面标记为包含不安全的内容。这是正确的,因为请求将通过http,然后重定向到https。因此, 不安全。

您要做的是使用Content-Security-Policy要求网络浏览器在加载页面时更新请求

Header always set Content-Security-Policy: upgrade-insecure-requests

有关详细信息,请参阅此处:https://www.w3.org/TR/upgrade-insecure-requests/

注意浏览器支持是这样的:http://caniuse.com/#search=upgrade%20insecure

答案 1 :(得分:3)

如果您可以启用模式标题,则可以将此代码添加到.htaccess或主机配置文件中:

<ifModule mod_headers.c>
Header always set Content-Security-Policy "upgrade-insecure-requests;"
</IfModule>

您可以在Ubunto中使用以下命令启用模式标题:

a2enmod headers
apache2 -k graceful

如果您无法编辑.htaccess或启用模式标题,则可以将HTML标题的行放在<head>...</head>之间:

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

答案 2 :(得分:0)

这不会起作用:

  RewriteEngine On 
  RewriteCond %{SERVER_PORT} 80 
  RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]

只需将其放在任何其他规则之前

此外,条件可能会更改为

 RewriteCond %{SERVER_PORT} !^443$

答案 3 :(得分:0)

  

基本上,当我通过HTTPS访问我的网站时,我想要一种自动化的方式来清理和处理混合内容。

建议使用将流量从HTTP重定向到HTTPS,但请注意,这不会修复混合内容错误。

事实上,如果从安全页面加载不安全的资源,浏览器将在任何情况下显示错误,无论资源是否被重定向到安全页面。

换句话说,如果页面list[y]加载index.htmlhttps://example.com/logo.png重定向到http://example.com/logo.png,则浏览器仍会显示混合内容警告。原因是因为来自安全页面的第一个请求在任何情况下都被发送到不安全的地址以获取响应(在这种情况下检测重定向)。

也就是说,为了从HTTP重定向到HTTPS,您可以使用规则

https://example.com/logo.png

相反,修复混合安全性错误的唯一方法是更改​​页面内容(或app / framework /用于创建它们的任何内容)以指向嵌入/加载/的资源的安全版本参考,当然假设可以在安全的服务器上访问资源。