"%{HTTPS} off"与 .htaccess 中"%{SERVER_PORT} 80"的优缺点 重写Cond 重定向到 HTTPS



要将流量路由到https://example.com。。。这两种方法的优缺点是什么?

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www. [NC]
RewriteCond %{HTTP_HOST} ^(www.)?(.+)$
RewriteRule (.*) https://%2%{REQUEST_URI} [R=301,NE,QSA]

与。

RewriteCond %{SERVER_PORT} 80 [OR]
RewriteCond %{HTTP_HOST} ^www. [NC]
RewriteCond %{HTTP_HOST} ^(www.)?(.+)$
RewriteRule (.*) https://%2%{REQUEST_URI} [R=301,NE,QSA]

另外,重写规则中的(.*)^(.*)$之间有什么有效的区别吗?

这两个规则块之间只有的区别是第一个条件:

RewriteCond %{HTTPS} off [OR]

RewriteCond %{SERVER_PORT} 80 [OR]

第一个条件检查HTTPS是否为off(与服务器端口无关(,第二个条件专门检查请求所指向的服务器端口。端口80是HTTP的默认端口(即非HTTPS(。

因此,如果您通过默认端口为HTTP提供服务,那么这两种情况实际上没有区别。如果您没有通过默认端口为HTTP提供服务,那么第一个条件仍然有效(因为这是由服务器派生的(,但是,第二个条件需要修改为适当的端口号。

此外,RewriteRule中的(.*)^(.*)$之间是否存在任何有效差异?

没有区别,因为regex默认情况下是贪婪的,并且*量词将尽可能多地消耗字符串(在这种情况下是URL路径(。你经常在野外看到^(.*)$的原因只是个人偏好或盲目复制/粘贴。

然而,在这种情况下,周围的括号也是不必要的,因为您没有使用捕获的反向引用(即$1(。您只需要.*——尽管即使这样也不是最佳的,因为它不必要地遍历整个URL路径。你不需要匹配任何东西,你只需要规则就可以成功。即^.?$将足够并且更有效。

RewriteRule (.*) https://%2%{REQUEST_URI} [R=301,NE,QSA]

QSA标志在这里是完全冗余的,因为默认情况下会传递查询字符串。

相关内容

最新更新