我在Heroku上有一个PHP应用程序,带有域名www版本的SSL证书。我需要(通过www和非www)的所有请求通过https转发,并且我已经添加了.htaccess。但是,仍然存在用户访问http版本的情况,我不明白为什么。
这是我的.htaccess:
RewriteEngine on
RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
我的理解是,这应该强制所有用户通过https://www
进行访问,但这并不总是会发生。例如,Google有时会在没有https
的情况下提供搜索结果,而链接会打开不安全的http
。
关于我做错了什么的任何想法?
答案 0 :(得分:3)
首先重定向到:443
上的同一主机名,然后重定向到www.
。普通www.
只是DNS中的别名,而大多数网站使用较短的非www主机名。您可能需要扩展证书,因为它需要显式添加两个主机名,除非它是通配符。
# rewrite to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
如果要将所有内容重写为www.
(或证书所说的任何内容),只需在下面添加其他规则即可。首次访问时,非SSL规则[L]
是最后一步,在下次访问时,SSL规则[L]
是重写的最后一步。
# rewrite to www.
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
另请参阅此答案here,关于robots.txt
强制SSL。
当“仍然可以使用HTTP”时...可能会考虑.htaccess
文件的另一个位置 - 或者为每个主机名创建目录,这只是重定向。
答案 1 :(得分:2)
请尝试以下规则并告知我这些规则是否有效这些规则将使用https请求而不是http或www和非www版本。现在,以下规则将用户重定向到类似的内容。
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L,NE]
希望这有助于实现您想要的目标