本篇主要讲Apache重定向redirects,通过配置.htaccess
文件实现www重定向到非www(或非www到www),http强制跳转到https。
如果你只需要实现跳转功能不需明白原理,只看第二部分即可。
介绍
如何使用Apache服务器配置将站点从www重定向到非www(或非www到www)以及从HTTP重定向到HTTPS。为了更清楚,配置将重定向以下主机名:
http://example.com
http://www.example.com
https://example.com
至
https://example.com
如果更喜欢www,一个小的改动,将非www重定向到www版本。
配置Apache
将以下重定向规则添加到Apache配置文件,或在站点的根目录中新增一个.htaccess
文件:
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(www.example.com),则只需更改第三行加!
和第五行加www
,如下:
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]
原理
如果你需要更加个性化的定制,有必要继续读下去,有助于实现你的需求。
RewriteEngine On
第一行启用执行重定向所需的Apache 重写引擎。如果已在同一文件中的先前配置中启用了,可以跳过这行。
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
这两行是重定向条件,它们用于确定是否应该重定向请求。因为条件与[OR]连接,如果这两个条件中的任何一个返回true,Apache将执行重写规则(重定向)。
第一个条件确定请求是否使用非HTTPS URL。第二个条件确定请求是否使用wwwURL。注意此处的使用www.和不使用www.,因为重写规则采用的是正则表达式,.点在这里有特殊含义,因此必须进行转义。
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
第四行是一个实用行,用来避免直接在URL中引用主机名。它匹配传入请求的HOST,并将其分解为www部分(如果有),以及主机名的其余部分。我们将与随后参考%1的RewriteRule。
如果事先知道主机名,则可以通过内联URL并跳过此条件来改进规则(参阅后面的内容)。
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
这RewriteRule
是重定向的核心。通过这一行,我们告诉Apache将任何请求重定向到新的URL,由以下组成:
- https://WWW
- %1:对主机的非www部分的调用
- %{REQUEST_URI}:请求的URI,没有主机名
所有这些参数都连接在一起,代表最终的重定向URI。最后,我们附加3个标记:
- NE 不要跳过特殊字符
- R=301 使用HTTP 301永久重定向状态
- L 停止处理其他规则,并立即重定向
备注
示例使用额外的RewriteCond行来提取主机名,并避免在规则中直接写主机名。如果觉得这对你来说是性能损失,可以直接在规则中写入主机:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
结论
本文提供了一种简单的配置,可将www和非HTTPS请求重定向到规范站点域。这对于避免搜索引擎的内容重复问题非常有用。
网上搜索有几十种方法在Apache中执行重定向,这只是其中一种可能性,无法覆盖所有可能的情况。希望通过“原理”部分中的说明,可以根据需要对其进行自定义。