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

问题描述 投票:0回答:4

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

这就是我想做的事情

最佳实践.htacess?

<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
重定向到
HTTPS
。例如:

1.

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

缺少一步?这里没有

[R=301,L]

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]
[L,R=301]

所以,我向所有专家提出的问题是:从

HTTP
重定向到
HTTPS
以及从
重定向到
HTTPS://
的最佳(执行)方法是什么?

.htaccess mod-rewrite https http-redirect
4个回答
39
投票

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

<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 发送到 https://domain.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}
如果您使用一些捕获(即
(some_regex)
),您应该在此处使用
$1
(或您要引用的任何内容)在目标中引用它。

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

您可以检查 https 是否已关闭 域名是否在一条规则中包含前导“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


6
投票

所以,浓缩,就变成了;

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

如果您发现任何错误,请告诉我


2
投票
    RewriteEngine On   
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

无需更改,只需复制并粘贴即可。


0
投票

相反的情况是什么? 假设您希望所有 https 请求都转到 HTTP。

当您没有该网站的 SSL 证书时,您会想要执行此操作,并且您也不想拥有 SSL 证书,因为它是一个小册子网站,不会向用户提出任何要求。

您所关心的只是避免出现令人讨厌的浏览器消息,这会吓到您的访问者。

© www.soinside.com 2019 - 2024. All rights reserved.