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