![使用 modrewrite 将 http 更改为 https (不重定向)](https://linux22.com/image/594712/%E4%BD%BF%E7%94%A8%20modrewrite%20%E5%B0%86%20http%20%E6%9B%B4%E6%94%B9%E4%B8%BA%20https%20%EF%BC%88%E4%B8%8D%E9%87%8D%E5%AE%9A%E5%90%91%EF%BC%89.png)
我有一个包含文件,比如说inc-navigation.html
,它有绝对路径 ( http://www.pathtoimage.com/image.com
),每个页面上都有。好吧,使用 SSL,我无法使用同一个包含文件,因为它没有引用。https://
真是太麻烦了!
因此,我可能正在考虑使用 htaccess 在浏览器请求 https 页面时对所有 HTTP 引用进行 URL 重写,将其改为 HTTPS。再次说明一下,我不想“重定向”,只想“替换”。
因此,我有这个:
RewriteCond %{HTTPS} !=on
RewriteRule ^http$ https
但它似乎不起作用。这种事真的可能吗?
答案1
HTTPS 是通过 SSL/TLS 实现的 HTTP,它保护传输层,即浏览器和 Web 服务器之间的通信。
mod_rewrite
通过重定向在内部或外部重写请求,但仅在浏览器发送请求后才进行,这对于您来说已经太晚了。
如果您想通过 HTTPS 连接使用通常托管在纯 HTTP 上的内容,您可以设置从 HTTPS 主机到纯 HTTP 主机的反向代理。mod_proxy_http
默认情况下,Apache 2.x 捆绑了 ,它将能够Location
在重定向中重写标头,但不能重写页面本身的内容(及其链接)。为此,您可能需要查看mod_proxy_html
,它应该能够重写页面本身内的链接。
话虽如此,在您的inc-navigation.html
文件中使用绝对链接听起来像是一个设计错误,执行搜索/替换以摆脱该文件中的这些绝对链接可能比设置更容易mod_proxy_html
。
如果您使用的某些绝对链接指向其他主机,则可以使用网络路径相对引用(以 开头//
,从而使方案成为相对的)。当然,这只有在这些主机启用了 HTTPS 时才有效。
答案2
您无法这样做,因为您需要让访问者的 Web 浏览器了解它应该使用安全(https)连接来获取这些项目,而如果您向访问者隐藏新位置则是不可能的(这是您在使用没有重定向的 RewriteRule 时所做的事情)。
我认为最好的办法是将包含文件更改为使用不指定域或协议的绝对路径。换句话说,在包含文件中更改:
http://www.domainname.com/path/to/image/image.png
到
/path/to/image/image.png
到处都会出现这样的现象。
答案3
你的语法有点错误,这是你需要的
RewriteCond %{HTTPS} !on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]