最佳实践:301 将 HTTP 重定向到 HTTPS(标准域)

2023-12-02

我一直在寻找完美的 301 重定向。但我找到了很多解决方案,但不知道什么是最好的。

这就是我想做的

  • http://域名.tld/https://域名.tld/
  • http://www.domain.tld/https://域名.tld/
  • https://www.domain.tld/https://域名.tld/

最佳实践.htaccess?

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>

这是我的首选代码。至少到现在为止。

替代方法

我还发现了很多其他方法来重定向HTTP to HTTPS。例如:

1.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

少了一步?和不[R=301,L] here?

2.

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

一般来说不同的顺序更好吗?

我应该使用

RewriteRule ^(.*)$

代替

RewriteRule (.*)

?

3.

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]

使用完整域名有性能优势吗?我真的需要吗NE? ([R=301,L,NE] vs. [L,R=301])

所以,我向所有专家提出的问题是:将两者重定向的最佳(执行)方法是什么?HTTP to HTTPS和来自 to HTTPS:// ?


从您最喜欢的解决方案开始:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>

在处理您重定向到的非 https URL 的部分中%{HTTP_HOST}。然后,如果您的主机名以“www”开头,则必须进行第二次重定向才能将您从https://www.domain.tld to https://域名.tld这应该是你的最终目的地。

您可以使用以下方法缩短此时间

RewriteRule ^(.*)$ https://domain.tld/%{REQUEST_URI} [L,R=301]

直接在第一条规则中。第二条规则仅适用于尝试访问的客户端https://www.domain.tld.

替代方案 1. 出于同样的原因不起作用(缺少以下情况)HTTP_HOST可能www.domain.tld)另外由于缺少[L,R=301]。这是必要的,因为您不只是在这里重写 URL,就像在其他类型的重写规则中所做的那样。您正在请求客户端更改其请求的类型 - 这就是您向他发送以下 HTTP 代码的原因301.

关于比赛部分RewriteRule本身,您应该保持一致:如果您想捕获 URI 的部分内容,您将使用带括号的正则表达式。由于您实际上在这里将其作为一个整体使用,因此可以只使用“任何东西”的替代方案之一,例如^并使用%{REQUEST_URI} later. If你使用一些捕获(即(some_regex)您应该使用在目标中引用它$1(或者你要引用的任何内容)在这里。

在您的第三种选择中,再次缺少 www + https。

你可以检查https是否关闭or如果域名在一条规则中包含前导“www”,则重写条件隐式地与“and”连接。

所以它应该是:

RewriteCond %{HTTPS} off          [OR]
RewriteCond %{HTTP_HOST} ^www\.   [NC]
RewriteRule ^ https://domain.tld%{REQUEST_URI} [R=301,L,NE]

NE 对于将 GET 参数等内容不变地传递到新 URI 是必需的,请参阅:

http://httpd.apache.org/docs/2.4/rewrite/flags.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最佳实践:301 将 HTTP 重定向到 HTTPS(标准域) 的相关文章

随机推荐