我有以下htaccess代码:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond !{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
我希望我的网站被重定向到https://www。使用HTTPS,并强制执行www。子域名,
但当我访问http://www时。(没有HTTPS),它不会重定向到https://www与HTTPS。
有很多解决方案。这里有一个apache wiki的链接,它直接处理了这个问题。
http://wiki.apache.org/httpd/RewriteHTTPToHTTPS
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context
michal的回答对我很有效,尽管做了一个小小的修改:
问题:
当您只有一个站点安全证书时,浏览器试图访问您的页面而没有https:// www。(或证书覆盖的任何域)将显示一个丑陋的红色警告屏幕,甚至在接收到安全正确的HTTPS页面的重定向之前。
解决方案
首先使用重定向到www(或证书覆盖的任何域名),然后才进行https重定向。这将确保您的用户不会遇到任何错误,因为您的浏览器看到的证书不包含当前url。
#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
糟糕的解决方案,为什么!
永远不要使用下面的解决方案,因为当你使用他们的代码时,它是这样的:
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301]
浏览器进入:
http://example.com
然后重定向到:
https://example.com
然后重定向到:
https://www.example.com
这对服务器来说请求太多了。
大多数答案甚至是公认的都有这个问题。
最好的解决方案和答案
这段代码有一个[OR]条件,以防止url的双重更改!
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
注意:请确保您已经完成了以下步骤
Sudo a2enmod重写
Sudo服务apache2重启
在vhost文件中添加Following,该文件位于/etc/apache2/sites-available/000-default.conf
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
现在你的.htaccess将会
Work和您的网站将重定向到http://到https://www