在.htaccess RewriteCond中重定向到HTTPS时,“%{HTTPS}关闭”与“%{SERVER_PORT} 80”的优缺点

xtfmy6hx  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(132)

将流量路由到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]

此外,重写规则中的(.*)^(.*)$之间是否存在有效差异?

myss37ts

myss37ts1#

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

RewriteCond %{HTTPS} off [OR]

对比

RewriteCond %{SERVER_PORT} 80 [OR]

第一个条件检查HTTPS是否为off(不考虑服务器端口),第二个条件专门检查向其发出请求的服务器端口。端口80是HTTP的 * 默认 * 端口(即不是HTTPS)。
因此,如果您通过默认端口提供HTTP服务,那么这两个条件实际上没有区别。如果您不通过默认端口提供HTTP服务,那么第一个条件仍然有效(因为这是由服务器派生的),但是,第二个条件需要修改为适当的端口号。
此外,在RewriteRule中,(.*)^(.*)$之间是否存在有效的差异?
没有区别,因为regex默认是 greedy,而*量词会尽可能多地消耗字符串(在本例中是URL路径)。
但是,在这种情况下,也不需要前后的括号,因为您没有使用捕获的反向引用您只需要.*-尽管这样做也不是最佳的,因为它不必要地遍历整个URL路径。您不需要匹配任何内容,你只需要规则是成功的。即^.?$就足够了,而且更有效。

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

QSA标志在这里完全是多余的,因为查询字符串在默认情况下是通过的。

相关问题