簡體   English   中英

.htaccess RewriteCond 中“%{HTTPS} off”與“%{SERVER_PORT} 80”的優缺點用於重定向到 HTTPS

[英]Pros and cons of "%{HTTPS} off" vs "%{SERVER_PORT} 80" in .htaccess RewriteCond for redirecting to 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]

此外,RewriteRule 中的(.*)^(.*)$之間是否有任何有效區別?

這兩個規則塊之間的唯一區別是第一個條件:

 RewriteCond %{HTTPS} off [OR]

對比

RewriteCond %{SERVER_PORT} 80 [OR]

第一個條件檢查 HTTPS 是否off (無論服務器端口如何),第二個條件專門檢查發出請求的服務器端口。 端口 80 是 HTTP 的默認端口(即不是 HTTPS)。

因此,如果您通過默認端口為 HTTP 提供服務,那么這兩個條件之間實際上沒有區別。 如果您沒有通過默認端口為 HTTP 提供服務,那么第一個條件仍然有效(因為這是由服務器派生的),但是,需要將第二個條件修改為適當的端口號。

此外, RewriteRule(.*)^(.*)$之間是否有任何有效區別?

沒有區別,因為正則表達式默認是貪婪的,並且*量詞將盡可能多地消耗字符串(在這種情況下為 URL 路徑)。 您在野外看到很多^(.*)$的原因只是個人喜好或盲目復制/粘貼。

但是,在這種情況下,周圍的括號也是不必要的,因為您沒有使用捕獲的反向引用(即$1 )。 您只需要.* - 盡管這也不是最佳選擇,因為它不必要地遍歷整個 URL 路徑。 你不需要匹配任何東西,你只需要規則成功。 IE。 ^.? $就足夠了,而且效率更高。

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

QSA標志在這里完全是多余的,因為默認情況下會傳遞查詢字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM