.htaccess使用SSL / HTTPS将www重定向到非www

时间:2009-09-25 15:59:18

标签: .htaccess redirect

我有几个域在一个.htaccess文件下运行,每个域都有一个SSL证书。

我需要在每个域上强制使用https前缀,同时确保www个版本重定向到no-www个。

以下是我的代码;它不起作用:

RewriteCond %{HTTP_HOST} ^www.%{HTTP_HOST}
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI}/$1 [R=301,L]

我想要实现的目标是:将https://www.example.com之类的内容重定向到https://example.com

我做错了什么,我该如何实现?

9 个答案:

答案 0 :(得分:83)

www到非www,https

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

答案 1 :(得分:18)

你的情况永远不会成真,因为它就像“if(a == a + b)”。

我会尝试以下方法:

RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]

这会将“google.com”从“www.google.com”捕获到%1,剩下的是1美元,之后合并2,当HTTP_HOST以www开头(有或没有https)。

答案 2 :(得分:9)

参考:Apache redirect www to non-www and HTTP to HTTPS

  

http://example.com

     

http://www.example.com

     

https://www.example.com

     

     

https://example.com

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

如果您希望默认网址为example.com,而不是www.example.com,则只需更改第三行和第五行:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

答案 3 :(得分:8)

要在单个请求中强制执行非www https ,您可以在htaccess中使用以下规则:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\. [OR]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R]

这会将 http://www.example.com/ https://www.example.com/ 重定向到ssl非www https://example.com/

我正在使用 R Temp Redirect标志进行测试并避免浏览器缓存。如果您想将重定向设为永久性,只需将 R 标记更改为 R = 301

答案 4 :(得分:5)

证书必须涵盖www和非www https。某些提供商的证书涵盖了www.xxxx.yyy,但仅涵盖了xxxx.yyy的一个。

开启重写:

RewriteEngine On

使所有http使用https:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R=301]

仅使用www https使用非www https:

RewriteCond %{SERVER_PORT} 443
RewriteCond %{HTTP_HOST} ^www[.].+$
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R=301]

无法处理非www https,否则会发生循环。

在[L,R = 301]中:

  1. L =如果处理了规则,请不要再处理。
  2. R = 301 =告诉浏览器/机器人进行永久重定向。
  3. 更通用

    更通用的方法 - 不依赖于端口 - 是:

    RewriteCond %{HTTP_HOST} ^www\.
    RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]
    

    使www删除任何网址。

    RewriteCond %{HTTPS} !on
    RewriteCond %{HTTPS} !1
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTP:X-Forwarded-SSL} !on
    RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]
    

    强制执行任何非https网址,即使对于那些丢弃https的负载均衡器下游的系统,也要使用https。

    请注意,我尚未对forwarded选项进行测试,因此会对与其有关的任何问题提供反馈。如果您的系统不在负载均衡器后面,那么这些行可能会被遗漏。

    到HTTP_HOST还是

    您可以使用${HTTP_HOST}成为RewriteRule中网址的一部分,也可以使用上面显式的规范域名文字(xxxx.yyy)。

    明确指定域名可确保在用户提供的URL中不会使用任何轻微的字符弯曲方式来欺骗您的网站做一些可能没有做好准备的事情,或者至少确保正确无论打开页面的URL字符串如何,域名都会显示在地址栏中。

    它甚至可以帮助转换punycode编码的域以在地址栏中显示正确的unicode字符。

答案 5 :(得分:2)

这对我有用:

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

答案 6 :(得分:1)

SQLSTATE[HY000] [1045] Access denied for user 'database username'@'localhost' (using password: YES)

经过多次试验和错误,这对我有用。第一部分来自上面的用户,将捕获www.xxx.yyy并发送到https://xxx.yyy

第2部分查看输入的URL并检查HTTPS是否发送到HTTPS

按此顺序完成,它遵循逻辑并且不会发生错误。

这是我在WordPress的htaccess方面的完整版本:

.footer_3 {
  position: relative;
  display: flex;
  align-items: top;
  justify-content: center;
  top: 220px;
     padding-bottom:100px;
}

.footer_4 {
  position: relative;
  display: flex;
  align-items: top;
  justify-content: center;
  top: 190px;
}

答案 7 :(得分:1)

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

这完全适合我!

答案 8 :(得分:0)

对我来说更好的是硬编码" example.com"作为字符串,所以我需要更少的规则,即使你可以使用它从.org重定向到.com或类似的:

gradle wrapper --gradle-version 4.8