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


69

我有多个域名在一个域名下运作 .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.comhttps://example.com

我在做什么错,如何解决?


希望这会有所帮助,它也解释了哪种最适合SEO。wpza.net/redirect-wordpress-to-https-using-htaccess-file
WPZA

Answers:


105

使用https将www转换为非www

RewriteEngine on

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

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

3
“ RewriteRule ^(。*)$ http://%1 / $ 1 [R = 301,L]”已更改为“ RewriteRule ^(。*)$ https://%1 / $ 1 [R = 301,L] ”(通过@KenVerhaegen),否则“它将首先重定向到非http,然后重定向到https ...,因此现在我们可以避免可能触发的第二次重定向。”
alexbt

确实很简单,很匹配,对于这个问题
Chetabahana '18

1
不管我尝试什么,它都不适用于Safari和Firefox。铬还可以。任何解决方案都将有所帮助-我仅对example.com拥有证书-对example.com
Kalpesh Popat

1
@KalpeshPopat:这可能是因为您的浏览器缓存在输入URL时会将信息保留在何处。DNS /浏览器缓存更新后,它将立即起作用。
Armin Hierstetter'4

31

参考:Apache将www重定向到非www并将HTTP重定向到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]

如果您希望默认网址不是www.example.com而不是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]

对于使用HTTPS重定向到非WWW URL,第一部分的答案非常完美,对我来说效果很好。
Tofiq Quadri

经过这么多年,您的答案仍然是魅力。
visrey '20

谢谢!这是完美的工作。
德米特里·雷昆

21

您的条件永远不会成立,因为它就像“ if(a == a + b)”。

我会尝试以下方法:

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

当HTTP_HOST以www开头(带或不带https)时,这会将“ google.com”从“ www.google.com”捕获到%1,其余部分在$ 1中,然后将2结合起来。


不幸的是,当有人尝试访问domain.com
爱琴海,2009年

1
嗯,但是重定向正确了吗?如果是这样,则可能是证书问题。
Fabian

2
请参阅以获取证书问题。
布鲁诺

11
RewriteRule ^。* $ https://%1 / $ 1 [R = 301,L]对我不起作用。如果我转到mysite.com/some/path,则将其重定向到mysite.com(如果将其更改为RewriteRule ^(。*)$ https://%1 / $ 1 [R = 301,L](请注意括号) ),然后按预期重定向到mysite.com/some/path
约翰

14

要在单个请求中强制使用非wwwhttps,可以在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即可


1
嗯,但是当我进入带有www safari的网站时仍然说页面不安全,歌剧不想将带有或不带有www的任何选项重定向到ssl,为什么?
Hubert Kubasiewicz

6
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]

这完全适合我!


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 =告诉浏览器/机器人进行永久重定向。

更通用

更为通用的方法(与端口无关)是:

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},作为URL中的一部分RewriteRule,也可以使用明确的规范域名文本(xxxx.yyy如上)。

明确指定域名可确保在用户提供的URL中不使用任何轻微的字符弯曲方式,以诱骗您的网站执行可能不准备的操作,或至少确保显示正确的域名在地址栏中,无论打开哪个URL字符串。

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


3

这对我有用:

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

2
RewriteEngine On

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

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

经过反复尝试,这对我有用。第一部分来自上方的用户,将捕获www.xxx.yyy并发送至https://xxx.yyy

第2部分查看输入的URL并检查HTTPS是否发送给HTTPS(如果不是)

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

这里是我在htaccess侧面使用WordPress的完整版本:

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

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [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

0

对我来说,最好将“ example.com”硬编码为字符串,所以我需要更少的规则,即使您也可以使用它从.org重定向到.com或类似的地址:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
  RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
</IfModule>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.