簡體   English   中英

htaccess 中重寫規則 apache 中 ^ 與 ^.*$ 之間的區別

[英]difference between ^ vs ^.*$ in Rewrite rule apache in htaccess

兩個表達式的第三行中的^^.*$有什么區別。 它們是相同的還是不同的

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^  %1 [L,R=301]

 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_URI} (.+)/$
 RewriteRule ^.*$  %1 [L,R=301]

這兩個示例中的最終結果是相同的,但它們在技術上有所不同,並且^在這種情況下更有效。

在這兩個規則中,您只需要RewriteRule指令對所有事情都成功,並且兩個正則表達式都可以實現。

^ - 這個正則表達式只是斷言字符串開始的錨點,所以它對一切都是成功的,但什么都不匹配。 $0反向引用為空。)

更新:例如,給定/abc的請求,那么所涉及的大約步驟是:

  1. ^斷言 URL 路徑的開始。
  2. 正則表達式中不再有符號。 正則表達式成功。 請求的 URL 路徑中沒有任何匹配項。 $0反向引用為空。 完畢

^.*$ - 這個正則表達式匹配任何東西,所以它對所有東西都是成功的,並且匹配所有東西 由於它實際上匹配了所有內容,因此$0反向引用存儲了匹配的整個 URL 路徑。 如果您只需要成功,那么效率會降低,因為它會遍歷整個 URL 路徑。 順便說一句,這與簡單的.*相同,因為正則表達式默認是貪婪的。

更新:例如,給定/abc的請求,那么所涉及的大約步驟是:

  1. ^斷言 URL 路徑的開始。
  2. . 匹配abca
  3. *量詞重復上一個匹配 0 次或更多次(貪婪)。
  4. . 匹配abc中的b
  5. *量詞重復上一個匹配 0 次或更多次(貪婪)。
  6. . 匹配abc中的c
  7. *量詞重復上一個匹配 0 次或更多次(貪婪)。
  8. . 不匹配任何內容(失敗),因為我們已到達 URL 路徑的末尾。
  9. $斷言 URL 路徑的結尾。
  10. 正則表達式中不再有符號。 正則表達式成功。 整個 URL 路徑已通過遍歷 URL 路徑進行匹配。 $0反向引用包含整個 URL 路徑。 完畢

然而...

 RewriteCond %{REQUEST_FILENAME}.-d RewriteCond %{REQUEST_URI} (,+)/$ RewriteRule ^ %1 [L,R=301]

這實際上可以提高效率,因為不需要第二個RewriteCond指令。 這種檢查應該在RewriteRule模式中進行,以避免對每個請求進行文件系統檢查,而不僅僅是以斜杠結尾的請求(這就是所有需要的)。 例如:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+)/$ /$1 [L,R=301]

RewriteRule模式首先被處理,在任何條件之前,所以你應該在這里做盡可能多的處理。 請注意在替換字符串上添加了斜杠前綴, $1反向引用中缺少該前綴。 (斜杠是%1反向引用的一部分 - 正如您之前使用的那樣 - 因為REQUEST_URI服務器變量以斜杠開頭。)

暫無
暫無

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

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