[英]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
的請求,那么所涉及的大約步驟是:
^
斷言 URL 路徑的開始。$0
反向引用為空。 完畢 ^.*$
- 這個正則表達式匹配任何東西,所以它對所有東西都是成功的,並且匹配所有東西。 由於它實際上匹配了所有內容,因此$0
反向引用存儲了匹配的整個 URL 路徑。 如果您只需要成功,那么效率會降低,因為它會遍歷整個 URL 路徑。 順便說一句,這與簡單的.*
相同,因為正則表達式默認是貪婪的。
更新:例如,給定/abc
的請求,那么所涉及的大約步驟是:
^
斷言 URL 路徑的開始。.
匹配abc
中a
。*
量詞重復上一個匹配 0 次或更多次(貪婪)。.
匹配abc
中的b
。*
量詞重復上一個匹配 0 次或更多次(貪婪)。.
匹配abc
中的c
。*
量詞重復上一個匹配 0 次或更多次(貪婪)。.
不匹配任何內容(失敗),因為我們已到達 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.