我有一个 wordpress 网站,现在应该完全通过 https 提供服务。我在大多数页面上都收到混合内容警告,因为很多内容在数据库中仍有 http 地址,但都可以通过 https 访问。
我的文件中有以下内容.htaccess
:
# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
我对 Apache 的经验有限,所以我的问题是为什么上面的重定向全部请求到 https,甚至嵌入的内容?
答案1
为什么上述操作没有将所有请求(甚至是嵌入的内容)重定向到 https?
确实如此,但会出现浏览器警告前请求实际发出。即在您的服务器能够重定向之前。这是必要的,以防止信息漏水通过 HTTP 和中间人攻擊。
当通过 HTTPS 发出请求时,客户端和服务器之间的通信是加密的。URL 路径是隐藏的,任何试图监视该网络流量的行为都会被阻止,因为它是加密的。但是,如果该 HTTPS 页面通过 HTTP 发出请求(针对任何外部资源、CSS、JS、图像、其他站点、AJAX 请求等),则 URL 路径是可见的,您可能会通过未加密的连接发送 cookie、会话信息等,第三方可以查看和操纵这些信息。
您需要将数据库中的 HTTP URL 更新为 HTTPS,以便您仅在客户端 HTML 中引用 HTTPS。
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
这是 302(临时)重定向。一旦一切正常,您就应该通过将标志更改为 将其更改为 301(永久R
)R=301
。